Files
solution-erp/docs/governance/adap-requests/2026-07-15-se-r6-user-memory-outside-repo-no-backup.md
pqhuy1987 2f068c58e5 [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>
2026-07-15 15:41:37 +07:00

104 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.