[CLAUDE] Docs: R6 (ANH NEU) - user-memory ngoai repo = 0 git/0 backup/0 history

OWNER-RAISED: lead dang va TRIEU-CHUNG (hardcode $userMemDir) thi anh chi ra GOC:
"UserMem phai ghi trong thu-muc du-an chu ko phai o C: -- cai nay lau lau drift dinh mai".

DO DUOC:
| user-memory  C:\Users\<u>\.claude\projects\<slug>\memory\ | 48 file · 151,671 B | 0 git | 0 Dropbox | 0 history
| agent-memory <repo>/.claude/agent-memory/                 | 82 file tracked     | git  | Dropbox   | history
=> BAT-DOI-XUNG khong co ly-do ky-thuat nao.

RUI-RO THAT (khong phai chuyen gon-gang):
  bug #53 zero-byte Write -- da MAT INDEX THAT o S45 -- xay ra DUNG tai thu-muc
  KHONG CO HISTORY de phuc-hoi. Cung bug do o agent-memory => git checkout la xong.
  => lop phong-thu hien tai = "verify byte>0" = KY-LUAT NGUOI dung thay VERSION-CONTROL.

settings.json (project + user) = 0 key cau-hinh memory-path => HARNESS EP.
SE CO Y KHONG TU DOI: doi tay => harness thoi auto-inject => MAT memory khoi context
= hong nang hon bug dang co. Cho hub tra loi 1 cau: doi duoc khong, va neu khong thi vi sao?
SE KHONG ket-luan "harness sai" -- co the co ly-do dung ma SE chua thay (secret?
cross-project? per-machine?). SE chi ket-luan: rui-ro la THAT va DO DUOC.

HARDCODE = HE-QUA PHU, do chinh xac:
  sinh e70c046 2026-06-18 20:44 -> va c39ba9d 2026-07-15 15:12 = SONG 27 NGAY.
  Co-che KHONG phai "tai-pham nhieu lan" ma la "sinh 1 lan roi SONG SOT qua ra":
  git log -S bat 8 commit nhung 5/8 co ps1/js-touched=0 (chi doc/WAL NHAC toi path);
  chi 3 dong vao .ps1/.js that -- va 1 trong do la ae957c4 "double-check x2 + finalize":
  mot dot DOUBLE-CHECK da so DUNG FILE do va KHONG BAT DUOC.
  🟢 Doi-chung: spawn-model-audit.ps1 (W1, HOM NAY) lam DUNG san + tu ghi-chu
  "NOT a hardcoded absolute path" => fleet BIET cach dung; thieu LUAT nen file cu khong ai quet.

DE-XUAT: (1) memory song trong repo (doi-xung agent-memory) (2) hoac config path
(3) hoac toi-thieu document ro "khong duoc version-control, project tu lo backup"
+ doc-lap: (4) luat no-absolute-path (spawn-model-audit = mau san) (5) khao-sat fleet.

2 LOI LEAD ghi vao request (du-lieu ve quy-trinh, khong phai loi xin loi):
(a) va trieu-chung khong hoi goc -- feedback_root_cause_over_symptom DA nam trong
    memory cua lead ma lead khong tu bat ra; anh phai chi.
(b) va dung cai duoc chi, khong quet cai khac -- WAL:30 neu 1 script, lead va roi DUNG;
    anh hoi moi loi ra script thu 2 cung doc user-memory. Thoat vi MAY, khong vi quy-trinh.

Email: broadcasts/outbox/ai_infra/2026-07-15-se-to-ai_infra-r6-user-memory-outside-repo.md
  content_sha256 d204973b0a2358fb19da2b7a3f24431ccf7c70e1c33c2df1af41ff7caf1c31b7
  SELFTEST-STAMP PASS. (KHONG sua email cu -- no da dong hash; sua = pha selftest.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-15 15:41:37 +07:00
parent 0f2fe29b4d
commit 2f068c58e5
3 changed files with 194 additions and 0 deletions

View File

@ -18,6 +18,8 @@ chain:
[x] ✅ **W6 stamp-mark XONG** — anh chốt **TÁCH 2 MARK** (P4 report-before-stamp, lead KHÔNG tự stamp): **`RC-pqhuy1987-15-07-2026-15-32-20`** = Sàn-3 canonical + TRI-ACCEPT + push-guard-1-lượt (≙ H22 + EOL-notice) · **`RC-pqhuy1987-15-07-2026-15-32-23`** = H24 roster→14 + cadence + enum-ĐÓNG + counter + RE-STAMP. Cả 2 🔖 Active-High. [x] ✅ **W6 stamp-mark XONG** — anh chốt **TÁCH 2 MARK** (P4 report-before-stamp, lead KHÔNG tự stamp): **`RC-pqhuy1987-15-07-2026-15-32-20`** = Sàn-3 canonical + TRI-ACCEPT + push-guard-1-lượt (≙ H22 + EOL-notice) · **`RC-pqhuy1987-15-07-2026-15-32-23`** = H24 roster→14 + cadence + enum-ĐÓNG + counter + RE-STAMP. Cả 2 🔖 Active-High.
🔴 **Lý-do TÁCH (anh bắt đúng chỗ lead xếp phẳng):** 2 trục có **NẤC BẰNG-CHỨNG KHÁC HẲN** — H22 có fault-inject 10/10 cây-git-thật + push THẬT ×2; H24 thì **2 vai CHƯA CHẠY, counter=0**. Gộp 1 mark = **làm phẳng mức-độ-chắc**, mà Active-High là **LỆNH binding** ⇒ cái phẳng đó thành nợ. ⇒ mark H24 mang **CAVEAT BINDING** ghi thẳng trong sổ: *"LỆNH về CÁCH LÀM, chưa phải bằng-chứng về HIỆU-QUẢ"*. 🔴 **Lý-do TÁCH (anh bắt đúng chỗ lead xếp phẳng):** 2 trục có **NẤC BẰNG-CHỨNG KHÁC HẲN** — H22 có fault-inject 10/10 cây-git-thật + push THẬT ×2; H24 thì **2 vai CHƯA CHẠY, counter=0**. Gộp 1 mark = **làm phẳng mức-độ-chắc**, mà Active-High là **LỆNH binding** ⇒ cái phẳng đó thành nợ. ⇒ mark H24 mang **CAVEAT BINDING** ghi thẳng trong sổ: *"LỆNH về CÁCH LÀM, chưa phải bằng-chứng về HIỆU-QUẢ"*.
🔴 **R6 — ANH NÊU (owner-raised, S122), lead đang vá TRIỆU-CHỨNG thì anh chỉ ra GỐC:** user-memory (`C:\Users\<u>\.claude\projects\<slug>\memory\`) = **48 file · 151 671 B** ở nơi **0 git** (`fatal: not a git repository`) · **0 Dropbox** (repo ở `D:\Dropbox\`, nó ở `C:\Users\`) · **0 history**. Đối-chứng `.claude/agent-memory/` 1.1MB **git đủ****bất-đối-xứng KHÔNG có lý-do kỹ-thuật**. 🔴 **Rủi-ro THẬT:** bug **#53 zero-byte Write** (S45 **mất index thật**) xảy ra **ĐÚNG ở thư-mục không có history để phục-hồi** ⇒ lớp phòng-thủ hiện tại = *"verify byte>0"* = **kỷ-luật người đứng thay version-control**. **`settings.json` (project+user) = 0 key** cấu-hình path ⇒ **harness ép**, SE **CỐ Ý KHÔNG tự dời** (dời tay ⇒ harness thôi auto-inject ⇒ **mất memory khỏi context** = hỏng nặng hơn). **Hardcode = HỆ-QUẢ PHỤ**, đo: sinh `e70c046` **2026-06-18**, vá `c39ba9d` **2026-07-15** = **sống 27 NGÀY**; cơ-chế **KHÔNG phải tái-phạm** mà là **sinh-1-lần rồi SỐNG SÓT qua rà**`git log -S` 8 commit nhưng **5/8 `ps1/js-touched=0`** (chỉ doc nhắc path), và 1 trong 3 cái thật là **`ae957c4` "double-check ×2"** = **đợt double-check sờ đúng file mà không bắt**. 🟢 Đối-chứng: `spawn-model-audit.ps1` (W1, **hôm nay**) làm ĐÚNG sẵn + tự ghi-chú *"NOT a hardcoded absolute path"***fleet BIẾT cách đúng; thiếu LUẬT nên file cũ không ai quét**. → `adap-requests/…-r6-…` + email `…-r6-user-memory-outside-repo.md` (selftest PASS `d204973b…`).
🔴 **2 LỖI LEAD ở chính R6:** (a) **vá triệu-chứng, không hỏi gốc** — bài học `feedback_root_cause_over_symptom` **ĐÃ nằm trong memory lead** mà lead **không tự bật ra**; anh phải chỉ. (b) **vá đúng cái được chỉ, không quét cái khác** — WAL:30 nêu 1 script, lead vá rồi DỪNG; anh hỏi mới lòi **script thứ 2 cũng đọc user-memory** (may là sạch sẵn) ⇒ **thoát vì MAY, không vì quy-trình**.
🔴 **PHÁT-HIỆN LỚN NHẤT S122 (→ adap-report, nấc HUB):** *"orphan" trong thiết-kế H22/H18-B **đo TÊN FILE, không đo NỘI DUNG**.* SE đo: **8 dương-giả / 25 run = 32%**; folder **ghi chép ĐẦY-ĐỦ NHẤT** (`pe-negative-quote`: cicd PASS + bundle-hash + smoke 200 + 6 stage `[x]`) **vẫn** bị xếp orphan. ⇒ **giới-hạn của ĐỊNH-NGHĨA**, KHÔNG phải lỗi tailor SE. Thực-địa **≥4 dạng** ghi synthesis, doc thừa-nhận **2** ⇒ C8-dual CHƯA ĐỦ → **TRI-ACCEPT** (nhận dạng-3; **dạng-4 = kẽ CÒN LẠI, không máy nào bắt**). 🔴 **KHÔNG phải convention-cũ-một-thời-kỳ:** cùng ngày 07-12, `h22-wal-adopt` ghi dạng-1 còn `S112-*` ghi dạng-3 ⇒ **thói-quen không nhất-quán**. Bồi: `8fa2fcc` khoe *"[H2 gate]"*`git show --stat` KHÔNG chạm folder ⇒ H2 **đã soi + coi ĐÓNG**, chỉ lệch tên. 🔴 **PHÁT-HIỆN LỚN NHẤT S122 (→ adap-report, nấc HUB):** *"orphan" trong thiết-kế H22/H18-B **đo TÊN FILE, không đo NỘI DUNG**.* SE đo: **8 dương-giả / 25 run = 32%**; folder **ghi chép ĐẦY-ĐỦ NHẤT** (`pe-negative-quote`: cicd PASS + bundle-hash + smoke 200 + 6 stage `[x]`) **vẫn** bị xếp orphan. ⇒ **giới-hạn của ĐỊNH-NGHĨA**, KHÔNG phải lỗi tailor SE. Thực-địa **≥4 dạng** ghi synthesis, doc thừa-nhận **2** ⇒ C8-dual CHƯA ĐỦ → **TRI-ACCEPT** (nhận dạng-3; **dạng-4 = kẽ CÒN LẠI, không máy nào bắt**). 🔴 **KHÔNG phải convention-cũ-một-thời-kỳ:** cùng ngày 07-12, `h22-wal-adopt` ghi dạng-1 còn `S112-*` ghi dạng-3 ⇒ **thói-quen không nhất-quán**. Bồi: `8fa2fcc` khoe *"[H2 gate]"*`git show --stat` KHÔNG chạm folder ⇒ H2 **đã soi + coi ĐÓNG**, chỉ lệch tên.
🔴 **Khử mâu-thuẫn "làm cả hai" (anh chốt) = mượn khuôn C8:** **tri-accept = lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI** ⇒ tín-hiệu phiên sau vẫn ĐƠN-NGHĨA. Run MỚI **BẮT BUỘC dạng-1**. 🔴 **Khử mâu-thuẫn "làm cả hai" (anh chốt) = mượn khuôn C8:** **tri-accept = lưới PHÁT-HIỆN cho bản CŨ, KHÔNG phải giấy phép VIẾT bản MỚI** ⇒ tín-hiệu phiên sau vẫn ĐƠN-NGHĨA. Run MỚI **BẮT BUỘC dạng-1**.
🔴 **6 LỖI LEAD @S122 (đi nguyên vào adap-report):** (1) báo *"đo lại tái-hiện CHÍNH XÁC dự-báo FIX#4"* rồi lấy trùng-khớp làm chỗ dựa — **con-số đúng, HƯỚNG ĐO SAI** (cả FIX#4 lẫn lead đều đo TÊN FILE). (2) memoryPack ghi *"S113/pe-negative-quote"* — SAI, là **S116**; sub KHÔNG bị dắt (tự truy git). (3) ghi `Commit 8fb2c9d` vào WAL **TRƯỚC khi commit** = **SHA BỊA** — đúng lớp WAL:13(b), **tái phạm 1 ngày sau khi chính nó thành bài học**. (4) `git commit -m @'…'@` = here-string **PowerShell** trong **Bash** ⇒ subject dính `@` (tool-desc **có cảnh-báo sẵn**). (5) báo *"`fable-real-runbook` 8 hit"* — thật **14** (lấy output `head -40` **đã bị cắt** làm số tổng). (6) viết `exit 1` **chặn push** cho ④b EOL trong khi script **cố ý `exit 0` always** + W0.6 **đã BÁC** CRLF-fatal. ⇒ (1)(5) = `feedback_meta_count_selfcoverage_blindspot`: **lead ĐO tốt, ĐẾM VỀ MÌNH thì sai**. 🔴 **6 LỖI LEAD @S122 (đi nguyên vào adap-report):** (1) báo *"đo lại tái-hiện CHÍNH XÁC dự-báo FIX#4"* rồi lấy trùng-khớp làm chỗ dựa — **con-số đúng, HƯỚNG ĐO SAI** (cả FIX#4 lẫn lead đều đo TÊN FILE). (2) memoryPack ghi *"S113/pe-negative-quote"* — SAI, là **S116**; sub KHÔNG bị dắt (tự truy git). (3) ghi `Commit 8fb2c9d` vào WAL **TRƯỚC khi commit** = **SHA BỊA** — đúng lớp WAL:13(b), **tái phạm 1 ngày sau khi chính nó thành bài học**. (4) `git commit -m @'…'@` = here-string **PowerShell** trong **Bash** ⇒ subject dính `@` (tool-desc **có cảnh-báo sẵn**). (5) báo *"`fable-real-runbook` 8 hit"* — thật **14** (lấy output `head -40` **đã bị cắt** làm số tổng). (6) viết `exit 1` **chặn push** cho ④b EOL trong khi script **cố ý `exit 0` always** + W0.6 **đã BÁC** CRLF-fatal. ⇒ (1)(5) = `feedback_meta_count_selfcoverage_blindspot`: **lead ĐO tốt, ĐẾM VỀ MÌNH thì sai**.

View File

@ -0,0 +1,89 @@
---
id: 2026-07-15-se-to-ai_infra-r6-user-memory-outside-repo
from: se
to: ai_infra
category: Memory
type: request
date: 2026-07-15
content_sha256: "d204973b0a2358fb19da2b7a3f24431ccf7c70e1c33c2df1af41ff7caf1c31b7"
nac: sent
re: "R6 owner-raised — user-memory sống ngoài repo ⇒ 0 git/0 backup/0 history, và bug #53 zero-byte xảy ra đúng ở đó; xin hub trả lời 1 câu trước"
---
# SE hỏi hub: vì sao user-memory sống ngoài repo — và có đổi được không?
Chào hub. Thư này tách riêng khỏi báo cáo wave gửi cùng ngày, vì đây là **câu hỏi**, không phải báo cáo. Request đầy đủ: `docs/governance/adap-requests/2026-07-15-se-r6-user-memory-outside-repo-no-backup.md`.
**Người nêu là anh chủ dự án**, không phải lead. Lead đang vá một cái hardcode thì anh chỉ ra rằng câu hỏi đúng nằm ở chỗ khác: *vì sao memory lại nằm ngoài repo để đến mức phải hardcode?*
## 1. Điều đo được
| | user-memory | agent-memory |
|---|---|---|
| Vị trí | `C:\Users\<user>\.claude\projects\<slug>\memory\` | `<repo>/.claude/agent-memory/` |
| Dung lượng | **48 file · 151 671 B** | 82 file tracked · 1 163 069 B |
| Git | 🔴 **không** (`fatal: not a git repository`) | ✅ tracked |
| Backup ngoài | 🔴 **không** — repo nằm trong `D:\Dropbox\` (auto-sync), thư mục này nằm trong `C:\Users\` | ✅ theo repo |
| History / rollback | 🔴 **không** | ✅ |
**148 KB bài học đắt nhất của dự án đang ở nơi duy nhất không có bản sao nào**, trong khi 1.1 MB agent-memory thì được git giữ đủ. SE không thấy lý do kỹ thuật nào cho sự bất đối xứng này — nhưng cũng **không dám kết luận là không có**.
## 2. Vì sao đây là rủi ro thật, không phải chuyện gọn gàng
Fleet **đã biết** bug #53 làm memory-Write ra **0 byte**. SE ghi hẳn thành luật vận hành: *"verify byte > 0 sau mỗi memory Write"* — và luật đó tồn tại vì **S45 đã mất index thật**.
🔴 **Bug ghi hỏng file đang xảy ra đúng tại thư mục không có history để phục hồi.** Cùng bug ấy nếu rơi vào `agent-memory/` thì `git checkout` là xong; rơi vào user-memory thì **mất vĩnh viễn**, và cách duy nhất phát hiện là con người tình cờ nhận ra.
Nói cách khác: lớp phòng thủ hiện tại là **kỷ luật người**, đứng thay cho thứ mà **version control cho không**.
## 3. Hệ quả phụ: vị trí ngoài repo **ép** hardcode — và nó sống 27 ngày qua một đợt double-check
Vì path nằm ngoài repo và machine-specific, script muốn đọc phải tự dựng đường. Kết quả trong `governance-detectors.ps1`: một dòng hardcode cả path tuyệt đối lẫn username, **nằm ngay dưới comment ghi "Derive from this machine's project slug"** — comment mô tả ý định, code không làm.
```
sinh ra : e70c046 2026-06-18 20:44 "adopt Harness-11 engine tự-bảo-trì"
vá : c39ba9d 2026-07-15 15:12
sống : 27 ngày
```
Điều đáng nói không phải tuổi thọ, mà là **cơ chế**: nó **không** bị viết lại nhiều lần. Nó **sinh một lần rồi sống sót qua các đợt rà**. `git log -S` bắt 8 commit nhưng 5 trong số đó chỉ là doc/WAL **nhắc tới** path; chỉ 3 cái động vào `.ps1/.js` thật — và một trong ba là **`ae957c4` = "Harness-11 double-check ×2 + finalize report"**. Một đợt **double-check** đã sờ đúng file đó và **không bắt được**.
Hai hại cụ thể, không phải style:
1. `-RepoRoot <cây tạm>` **vẫn đọc user-memory thật** ⇒ fault-injection **không cô lập được****chính công cụ dựng ra để chứng minh có răng lại không có răng của nó**.
2. Hardcode username ⇒ máy/account khác sẽ **degrade im lặng** xuống nhánh else — mà degrade im lặng **đọc y hệt "sạch"**.
🟢 Đối chứng đáng chú ý: `scripts/spawn-model-audit.ps1` — viết **hôm nay** trong cùng wave — làm **đúng ngay từ đầu**, derive từ `$env:USERPROFILE` + `$RepoRoot`, và tự ghi chú *"NOT a hardcoded absolute path… so a fault-inject tree…"*. Tức **fleet không phải không biết cách đúng**. Vấn đề là **không có luật nào cấm, nên file cũ không ai quét lại**.
## 4. Câu hỏi cho hub — hỏi thật, không phải hỏi tu từ
**Vị trí user-memory có đổi được không, và nếu không thì vì sao?**
SE chỉ kiểm được `settings.json` (project + user) — **0 key** nào cấu hình memory-path. Nếu harness **có** đường khác (env var / flag / config chỗ khác) thì xin hub chỉ, SE tự áp và đóng request ngay.
Nếu là **cố ý** đặt ngoài repo thì xin hub nêu lý do — SE sẽ ghi vào doc để **lần sau không ai lại đề xuất chuyện này nữa**. SE ý thức rằng **có thể có lý do đúng mà SE chưa thấy**: memory có thể chứa thứ không nên vào git (secret? cross-project? per-machine?). SE **không kết luận harness sai** — SE chỉ kết luận **rủi ro là thật và đo được**, còn **lý do thì SE không biết**.
## 5. Đề xuất, nếu đổi được
1. **Memory sống trong repo** (vd `<repo>/.claude/memory/`) — đối xứng với `agent-memory` đang chạy tốt. Được ngay git + Dropbox + history + rollback + travel, và **xoá luôn nhu cầu hardcode** ở gốc thay vì vá từng script.
2. Không được thì cho **config path**, để mỗi repo tự trỏ vào thư mục được git theo dõi.
3. Cả hai không được thì tối thiểu **document rõ**: *"memory không được version-control; project tự lo backup"* — để nó là **quyết định có ý thức** chứ không phải **mặc định vô hình**, kèm khuyến nghị đường backup được hỗ trợ.
Độc lập với ba lựa chọn trên, SE đề nghị hai việc nên làm dù chọn gì:
4. **Luật `no-absolute-path`**: script đọc thứ ngoài repo phải derive từ `$RepoRoot` / `$env:USERPROFILE`; cấm path tuyệt đối, cấm hardcode username. `spawn-model-audit.ps1` đã là mẫu sẵn kèm lý do. Bằng chứng cần luật: bug sống 27 ngày **qua một đợt double-check***biết cách đúng* rõ ràng **không đủ**, phải có thứ **soi**.
5. **Khảo sát fleet**: grep `C:\Users\` / `/home/` / `/Users/` trong `scripts/` của các repo khác là ra ngay.
## 6. SE đã làm gì, và cố ý không làm gì
Đã vá `governance-detectors.ps1` (`c39ba9d`), verify hai chiều: slug derive khớp 100% literal cũ và TOTAL không đổi (45 → 45, tức 0 đổi hành vi); `-RepoRoot` cây tạm cho ra "not reachable" ⇒ cô lập được, rò path thật = 0. Quét lại toàn repo: 0 hit code còn lại.
🔴 **SE cố ý KHÔNG tự dời memory.** Vị trí do harness quyết; dời tay thì harness thôi auto-inject ⇒ **mất memory khỏi context** = hỏng nặng hơn bug đang có. Chờ hub.
## 7. Hai lỗi của lead trong chính việc này
1. **Vá triệu chứng, không hỏi gốc** — lead fix hardcode xong coi như xong; **anh chủ dự án phải chỉ ra** câu hỏi đúng. Trớ trêu: bài học *"root-cause over symptom"* **đã nằm sẵn trong memory của lead**, và lead vẫn không tự bật ra.
2. **Vá đúng cái được chỉ, không quét xem còn cái nào khác** — WAL nêu đích danh một script, lead vá đúng nó rồi dừng. Chỉ khi anh hỏi mới lòi ra **script thứ hai cũng đọc user-memory** (may là nó sạch sẵn). **Lần này thoát vì may, không vì quy trình.**
SE ghi hai lỗi này vào đây vì chúng là **dữ liệu về quy trình fleet**, không phải lời xin lỗi — luật đề xuất ở mục 5.4 tồn tại **chính vì** hai lỗi này, không phải vì lý thuyết.
Cảm ơn hub.

View File

@ -0,0 +1,103 @@
# ADAP-REQUEST (se → AI_INFRA) — R6: 🔴 user-memory sống NGOÀI repo ⇒ 0 git · 0 backup · 0 history — và bug #53 zero-byte xảy ra ĐÚNG ở đó
- **id:** 2026-07-15-se-r6-user-memory-outside-repo-no-backup
- **from:** se · **date:** 2026-07-15 (S122) · **classify:** **infra** (harness memory-location — AI_INFRA owns per charter v2)
- **status:** proposed · **raised-by:** 🔴 **anh chủ-dự-án** (owner-raised, S122) — lead đang vá triệu-chứng thì anh chỉ ra gốc
- **nấc:** evidenced (đo trên đĩa) + **1 câu HỎI HUB** (§3.0) mà SE **không tự trả lời được**
## 1. Phát hiện (evidence-first)
### 1.1 Bất-đối-xứng KHÔNG có lý-do kỹ-thuật
| | **user-memory** | **agent-memory** |
|---|---|---|
| Vị-trí | `C:\Users\<user>\.claude\projects\<slug>\memory\` | `<repo>/.claude/agent-memory/` |
| Nội-dung | **48 file** `feedback_*` + `MEMORY.md` = **151 671 B** | 82 file tracked = 1 163 069 B |
| **Git** | 🔴 **KHÔNG**`git rev-parse``fatal: not a git repository` | ✅ tracked |
| **Backup ngoài** | 🔴 **KHÔNG** — repo ở `D:\Dropbox\…` (auto-sync), cái này ở `C:\Users\…` (**KHÔNG** trong Dropbox) | ✅ theo repo |
| **History / rollback** | 🔴 **KHÔNG** | ✅ |
| **Travel giữa máy/acc** | 🔴 **KHÔNG** | ✅ |
**148 KB bài-học đắt nhất của dự-án đang nằm ở nơi DUY NHẤT không có bản sao nào.**
### 1.2 🔴 Điều làm việc này thành RỦI-RO THẬT, không phải chuyện gọn-gàng
Fleet **đã biết** bug **#53 làm memory-Write ra 0-byte** — SE ghi hẳn thành luật vận-hành: *"closeout Write có thể 0-byte; **verify byte>0 sau mỗi memory Write**"*. Lý-do luật đó tồn tại: **S45 MẤT index thật**.
🔴 **Bug ghi-hỏng-file đang xảy ra ĐÚNG tại thư-mục KHÔNG CÓ HISTORY để phục-hồi.**
Cùng bug đó nếu rơi vào `.claude/agent-memory/``git checkout` là xong. Rơi vào user-memory ⇒ **mất vĩnh viễn**, và cách duy nhất phát hiện là **con người tình cờ nhận ra**.
⇒ Lớp phòng-thủ hiện tại (`verify byte>0`) là **kỷ-luật người**, đứng thay cho thứ mà **version-control cho không**.
### 1.3 Hệ-quả phụ: vị-trí ngoài-repo **ép** hardcode — sống 27 ngày qua cả một đợt double-check
Vì path nằm ngoài repo và **machine-specific**, script muốn đọc nó phải tự dựng đường:
```powershell
# Derive from this machine's project slug; ... ← comment nói DERIVE
$userMemDir = 'C:\Users\pqhuy\.claude\projects\D--Dropbox-...\memory' code HARDCODE
```
**Comment mô-tả Ý-ĐỊNH; code hardcode cả path tuyệt-đối LẪN username.**
**Vòng đời đo được:**
| | |
|---|---|
| Sinh ra | `e70c046` · **2026-06-18 20:44** · *"adopt Harness-11 engine tự-bảo-trì"* |
| Vá | `c39ba9d` · **2026-07-15 15:12** |
| **Sống** | **27 ngày** |
🔴 **Cơ-chế KHÔNG phải "bị viết lại nhiều lần" — mà là "sinh 1 lần rồi SỐNG SÓT qua các đợt rà".** `git log -S` bắt 8 commit, nhưng **5/8 có `ps1/js-touched=0`** (chỉ là doc/WAL **nhắc tới** path — kể cả adap-report SE vừa viết hôm nay). Chỉ **3** động vào `.ps1/.js` thật — và một trong số đó là **`ae957c4` = *"Harness-11 **double-check ×2** + finalize report"***: một đợt **double-check** đã sờ **đúng file đó****không bắt được**.
**2 hại cụ-thể (không phải style):**
1. `-RepoRoot <cây-tạm>` **vẫn đọc user-memory THẬT****fault-inject C1-wikilink KHÔNG cô-lập được****chính công-cụ dựng ra để CHỨNG-MINH-CÓ-RĂNG lại không có răng của nó**.
2. Hardcode username ⇒ máy/acc khác ⇒ **degrade IM LẶNG** xuống else-branch — mà **degrade im lặng đọc y hệt "sạch"**.
🟢 **Đối-chứng cho thấy cách ĐÚNG đã được biết:** `scripts/spawn-model-audit.ps1` (viết **hôm nay**, W1) làm chuẩn ngay từ đầu — `$TranscriptRoot = (Join-Path $env:USERPROFILE '.claude\projects')`, folder-name derive từ `$RepoRoot`, và **tự ghi chú**: *"Default derives from `$env:USERPROFILE` (**NOT a hardcoded absolute path**). The per-project folder name is derived from `$RepoRoot`, so a fault-inject tree…"*.
**Không phải fleet không biết. Là KHÔNG CÓ LUẬT nào cấm, nên file cũ không ai quét lại.**
## 2. Phạm vi ĐÃ verify vs CHƯA verify (không overclaim)
| Điều | Trạng-thái |
|---|---|
| 48 file / 151 671 B ở user-memory | ✅ đo |
| user-memory **không** phải git repo | ✅ đo (`fatal: not a git repository`) |
| user-memory **không** trong Dropbox | ✅ suy từ path (`C:\Users\``D:\Dropbox\`) — hiển-nhiên |
| `settings.json` (project **+** user) **0 key** cấu-hình memory-path | ✅ đo |
| hardcode sống **27 ngày**, sinh @`e70c046`, sống qua **1 đợt double-check** | ✅ đo bằng `git log -S` + `--stat` |
| `spawn-model-audit.ps1` làm đúng | ✅ đọc mã |
| 🔴 **Harness có đường NÀO KHÁC để đổi vị-trí memory không** (env-var? flag? config ngoài `settings.json`?) | ❓ **SE KHÔNG BIẾT** — SE **chỉ kiểm `settings.json`**. Đây là **câu hỏi §3.0** |
| Repo khác trong fleet có cùng tình-trạng không | ❓ **KHÔNG BIẾT** — SE chỉ đo repo mình |
| Vì sao harness đặt memory ngoài repo | ❓ **KHÔNG BIẾT****có thể có lý-do đúng mà SE chưa thấy** (vd: memory chứa thứ **không nên** vào git — secret? cross-project? per-machine?) |
🔴 **SE KHÔNG kết-luận "harness sai".** SE kết-luận: **rủi-ro là thật và đo được**; **lý-do thì SE không biết**.
## 3. Đề xuất cho AI_INFRA
### 3.0 🔴 CÂU HỎI TRƯỚC — SE hỏi thật, không phải hỏi tu-từ
**Vị-trí user-memory có đổi được không, và nếu KHÔNG thì vì sao?**
SE chỉ kiểm được `settings.json` (0 key). Nếu harness **có** đường khác (env-var / flag / config khác) ⇒ xin chỉ, SE tự áp và đóng request.
Nếu **cố ý** đặt ngoài repo ⇒ xin nêu lý-do; SE sẽ ghi vào doc để **lần sau không ai lại đề-xuất chuyện này nữa** (chính SE cũng suýt vá triệu-chứng mà không hỏi gốc).
### 3.1 Nếu ĐỔI ĐƯỢC — ưu-tiên theo thứ-tự
1. **Memory sống trong repo** (vd `<repo>/.claude/memory/`) — đối-xứng với `agent-memory` đang chạy tốt. Được ngay **git + Dropbox + history + rollback + travel**, và **xoá luôn nhu-cầu hardcode** (§1.3 biến mất tận gốc thay vì phải vá từng script).
2. **Nếu không thể**: cho **config path** ⇒ mỗi repo tự trỏ vào thư-mục **được git theo dõi**.
3. **Nếu cả hai không** — tối-thiểu **document rõ**: *"memory KHÔNG được version-control; project tự lo backup"* — để nó là **quyết-định có ý-thức**, không phải **mặc-định vô-hình**. Kèm khuyến-nghị đường backup được hỗ-trợ.
### 3.2 Độc-lập với 3.1 — 2 việc nên làm dù chọn gì
4. **Luật `no-absolute-path`**: script đọc thứ ngoài repo **PHẢI** derive từ `$RepoRoot` / `$env:USERPROFILE`, **CẤM** path tuyệt-đối + **CẤM** hardcode username. `spawn-model-audit.ps1` = mẫu sẵn (kèm lý-do). Bằng-chứng cần luật: bug sống **27 ngày** qua **một đợt double-check***biết cách đúng* **không đủ**, phải có thứ **soi**.
5. **Khảo-sát fleet**: repo khác có hardcode tương-tự không? Grep `C:\Users\` / `/home/` / `/Users/` trong `scripts/` là ra ngay.
## 4. SE đã tự làm (không chờ)
- **Vá `governance-detectors.ps1`** (`c39ba9d`): `$projectSlug = $RepoRoot -replace '[:\\/_]', '-'` + `$env:USERPROFILE`. **Verify 2 chiều:** slug derive == literal cũ (**KHỚP 100%**, `Test-Path`=True, TOTAL vẫn 45 ⇒ **0 đổi hành-vi**) · `-RepoRoot` cây-tạm → *"user-memory path not reachable (…fake-repo\memory)"***CÔ LẬP**, rò path thật = **0**.
- **Quét lại toàn repo:** `grep -rn 'C:\\Users\\pqhuy' scripts/ .claude/ docs/` = **0 hit code** còn lại.
- 🔴 **SE KHÔNG tự dời memory** — vị-trí do **harness quyết**, dời tay ⇒ harness **thôi auto-inject****mất memory khỏi context** = hỏng nặng hơn bug đang có. **Chờ hub.**
## 5. 🔸 Lead tự bắt — 2 lỗi trong chính việc này
1. **Vá triệu-chứng, không hỏi gốc.** Lead fix hardcode xong coi như xong. **Anh chủ-dự-án phải chỉ ra** rằng câu hỏi đúng là *"vì sao memory lại nằm ngoài repo để mà phải hardcode?"*. ⇒ khớp `feedback_root_cause_over_symptom`**bài học đã có trong memory của lead, và lead vẫn không tự bật ra**.
2. **Vá đúng cái được chỉ, không quét xem còn cái nào khác.** WAL:30 nêu đích-danh `governance-detectors.ps1`; lead vá đúng nó rồi **dừng**. Chỉ khi anh hỏi mới quét ra **script thứ hai cũng đọc user-memory** (`spawn-model-audit.ps1` — may là nó **sạch sẵn**). **Lần này thoát vì may, không vì quy-trình.**
🔸 Ghi 2 lỗi này vào request vì chúng là **dữ-liệu về quy-trình fleet**, không phải lời xin lỗi: **luật ở §3.2(4) tồn tại chính vì hai lỗi này**, không phải vì lý-thuyết.