# Vocab Alias-Map — Bản đồ Thuật ngữ Tương đương

> **Mục đích:** Đây là nguồn duy nhất (single source) ghi lại các cặp thuật ngữ ĐỒNG NGHĨA trong SOLUTION_ERP — một khái niệm nhưng đang tồn tại dưới hai cái tên (canonical hiện hành ↔ alias lịch sử đã bị thay thế). Tài liệu phục vụ đợt kiểm tra trôi-nghĩa (drift audit) hằng tháng: khi detector `scripts/governance-detectors.ps1` (kiểm tra C3 — vocab-fork) phát cờ báo "hai biến thể cùng sống side-by-side", người rà soát mở file này để tra ngay đâu là từ chuẩn, đâu là từ cũ, và lý do đổi tên.
>
> **Chủ sở hữu ghi (single-writer):** em-main. Tài liệu **append-only** — chỉ thêm dòng mới khi phát sinh cặp thuật ngữ mới, KHÔNG viết lại các mục cũ. Sub-agent chỉ đọc, không được sửa (tuân thủ nguyên tắc D9 single-writer).
>
> **Phạm vi:** Chỉ ghi các cặp thật sự là MỘT khái niệm hai tên (fork-để-hợp-nhất). KHÔNG ghi các từ trùng-mặt-chữ nhưng khác nghĩa (ví dụ "memory-fidelity", "coverage", "audit") — những từ đó đã được phân biệt bằng ngữ cảnh trong `harness-11-engine.md` PHẦN H/I và cố ý KHÔNG seed vào detector.

---

## ⚠️ Lưu ý nền tảng — vì sao alias vẫn còn xuất hiện đầy trong repo

Phần lớn số lần alias xuất hiện là **hợp lệ theo lịch sử — KHÔNG phải drift cần sửa**. Các file dưới đây **ĐÓNG BĂNG (frozen), tuyệt đối không viết lại**:

- `docs/changelog/sessions/**` — nhật ký từng session (ghi lại đúng từ ngữ tại thời điểm đó).
- `docs/_archive/**` — snapshot STATUS/HANDOFF đã archive verbatim.
- `docs/governance/adap-reports/**` — báo cáo adoption đã chốt.
- `.claude/workflows/runs/**` — vết chạy workflow (run-trace), git-tracked bất biến.
- `broadcasts/inbox|outbox/**` — thư liên-team đã gửi.

Một session-log viết "two-tier" hồi S60 là **đúng sự thật lịch sử** — nó phản ánh mô hình còn hiệu lực khi đó. Không được sửa ngược quá khứ. Do vậy alias sẽ **mãi mãi còn tồn tại** trong các file đóng băng, và detector C3 (quét TOÀN BỘ `docs/**` + `.claude/**` *.md, KHÔNG loại trừ file frozen) sẽ **vẫn tiếp tục báo cờ MED** cho mỗi cặp — đây là trạng thái **documented-known**, không phải lỗi tồn đọng. Việc "làm sạch" chỉ áp dụng cho các file **đang-sống (live-editable)**: `docs/STATUS.md`, `docs/HANDOFF.md`, các `SKILL.md`, `agent-memory/**/MEMORY.md` (bản HOT, không phải archive), và các doc governance đang bảo trì.

---

## Bảng thuật ngữ tương đương

### 1. `run-trace` (chuẩn) ↔ `wave-folder` (alias cũ)

| Thuộc tính | Giá trị |
|---|---|
| **Canonical (hiện hành)** | `run-trace` — thư mục cô lập bộ nhớ mỗi lần chạy workflow tại `.claude/workflows/runs/<id>/` |
| **Alias (đã thay thế)** | `wave-folder` / `wave-*` — tên cũ của cùng thư mục cô lập đó |
| **Đổi tên bởi** | Harness-10 (Session 72, 2026-06-18) — đổi cấu trúc `wave-*` sang mô hình run-trace phẳng (`sub-*.md` + `*-synthesis.md`) git-tracked |
| **Ghi chú frozen** | Session-log/adap-report/runs cũ giữ nguyên "wave-folder" — đúng lịch sử, không sửa |

### 2. `Ngân sách PRO` (chuẩn) ↔ `Dự trù PRO` (alias cũ)

| Thuộc tính | Giá trị |
|---|---|
| **Canonical (hiện hành)** | `Ngân sách PRO` — nhãn cột/badge PRO trong ma trận ngân sách PE (module PurchaseEvaluation) |
| **Alias (đã thay thế)** | `Dự trù PRO` — nhãn cũ trước khi anh Kiệt (FDC) yêu cầu đổi |
| **Đổi tên bởi** | Session 65 (2026-06-16) — anh Kiệt Zalo: "Dự trù PRO → Ngân sách PRO"; áp dụng row + badge trên cả 2 app (fe-admin + fe-user), SHA256-mirror |
| **Ghi chú kỹ thuật** | Field BE gốc `PeWorkItemBudget.ProInitialAmount` ("Ban hành lần đầu") + `ProAdjustmentAmount`; nhánh `ProEstimateAmount` cũ đánh dấu LEGACY (Mig 56 migrate → ProInitialAmount). Còn 1 comment mã nguồn stale ở `PurchaseEvaluationDtos.cs:324` ("badge dự trù PRO") — chỉ là comment, KHÔNG phải nhãn FE đang render; có thể dọn khi tiện, không bắt buộc |
| **Ghi chú frozen** | Session-log S65 và bản archive giữ "Dự trù PRO" — đúng lịch sử |
| **Lưu ý mở rộng** | `PeWorkItemBudget` là tên ENTITY (khái niệm khác — bảng ngân-sách-per-gói-thầu), KHÔNG phải alias của nhãn PRO. "PRO" = Procurement (phòng Mua hàng), không phải viết tắt khác |

### 3. `worker-tier-pin` (chuẩn) ↔ `all-inherit` · `two-tier` (2 alias cũ, 2 đời)

| Thuộc tính | Giá trị |
|---|---|
| **Canonical (hiện hành)** | `worker-tier-pin` — 14/14 sub-agent frontmatter `model: opus` + `effort: max` (worker-tier gán-cứng, KHÔNG theo lead); lead = frontier-class owner-choice per-session; Fable cho 1 vai CHỈ qua lượt lệnh `/fable-real`·`/fable-clone` hoặc per-task `tier:` — spawn-param THẮNG hard-pin (đo S126 2026-07-16, `runs/2026-07-16-S126-adap-spec-execute/runtime-verify-synthesis.md`) |
| **Alias (đã thay thế — đời 2)** | `all-inherit` — mọi sub-agent kế thừa model lead (chất-lượng > chi-phí; Harness-8, S66–S123) |
| **Alias (đã thay thế — đời 1)** | `two-tier` — mô hình 2 tầng (lead promote-inherit vài agent / demote-pin số còn lại về Opus; Harness-4) |
| **Đổi tên bởi** | Owner-decision **S124** (2026-07-15, adap `erratum-h8`) — thay all-inherit bằng worker-tier-pin. Trước đó: Harness-8 (S66, 2026-06-16) thay two-tier bằng all-inherit |
| **Ghi chú frozen** | adap-report/session-log ≤S66 giữ "two-tier", S66–S123 giữ "all-inherit" — đúng lịch sử tại thời điểm đó |

---

## Quy trình cập nhật (khi thêm cặp mới)

1. Chỉ append 1 mục `### N.` mới bên dưới, KHÔNG sửa mục cũ.
2. Ghi đủ 4 trường: **canonical · alias · đổi-tên-bởi (Harness/Session) · ghi-chú-frozen**.
3. Nếu muốn detector nhận-biết cặp mới, seed vào `$aliasSets` trong `scripts/governance-detectors.ps1` (C3). Lưu ý: detector CHỈ grep, KHÔNG đọc file này — xem mục dưới.

---

## Về việc detector có "im" sau khi tạo file này không

**KHÔNG.** Detector C3 (`scripts/governance-detectors.ps1`) là **pure-grep**: `$aliasSets` được hard-code trong script (dòng ~350-354), và C3 báo cờ mỗi khi ≥2 biến thể của một set còn sống trong corpus. Nó **KHÔNG đọc bất kỳ alias-map file nào**. Vì các file frozen (mãi mãi chứa alias) nằm trong phạm vi quét, cờ MED cho cả 3 cặp sẽ **vẫn còn** — nay chuyển trạng thái thành **documented-known** (đã có tài liệu giải thích tại đây), không còn là drift lạ.

> Câu "resolve: … or record an alias-map in docs/governance" trong output detector là **gợi ý cho con người**, KHÔNG phải hook tự-động. Muốn detector THẬT-SỰ ngừng báo cặp nào, phải sửa `$aliasSets` (bỏ set đó) — nhưng làm vậy sẽ mất khả năng phát hiện fork tương lai, nên **không khuyến nghị**.

> **Cảnh báo self-match:** File `vocab-alias-map.md` này tự thân chứa cả 6 thuật ngữ ở dạng live → nếu KHÔNG loại trừ, nó sẽ tự-đóng-góp thêm 1 file live cho MỖI biến thể và khiến detector đếm sai. Cần thêm đường dẫn `docs/governance/vocab-alias-map.md` vào `$ExcludeExact` trong `governance-detectors.ps1` (đặt cạnh `harness-11-engine.md` đã được loại trừ sẵn) để tài liệu này không tự-match. Đây là bước bắt buộc khi commit file.
