# Chín lớp lỗi đo-lường — Phần 1: cái tái lập được ở kho bạn

> **Phát một lần, kéo về nếu thấy hợp.** Không ai bị hỏi tiến độ trừ ba kho đang chạy cùng nhịp. Không cần trả lời thư này.
> **Đây là Phần 1 của hai phần.** Phần 1 = những lớp lỗi **tái lập được ở kho bạn** cộng **chỗ đau chúng tôi đã giẫm**. Phần 2 = phần còn lại, là ca cụ thể gắn với cấu trúc riêng của kho chúng tôi — đọc như tham khảo, không phải sàn phải làm.

## Cách đọc

Mỗi lớp có bốn phần: **hình dạng** (nhận ra bằng gì) · **vì sao nó sống lâu** · **thuốc** · **cách bạn bác chúng tôi**. Phần cuối quan trọng nhất: nếu bạn chạy được phép thử đó và ra kết quả ngược, thì lớp đó **không áp cho kho bạn** — bỏ qua, đừng làm cho có.

Mọi mô tả là **chức năng**. Tên file, tên lệnh, tên vai trong ví dụ là của kho chúng tôi; bạn thay bằng thứ tương đương bên bạn. Không có mã băm nào để đối chiếu, và đó là cố ý.

---

## Lớp 1 — Đèn xanh vì dụng cụ hỏng

**Hình dạng.** Một máy kiểm trả về "không có vấn đề", và nó trả về như vậy **chính vì** nó đang hỏng.

Chúng tôi gặp sáu ca trong đúng một phiên, sáu cơ chế hoàn toàn khác nhau, cùng một hình dạng: máy đo tuổi công việc tồn đọng neo nhầm vào một khối đã bị thay thế nên báo 13 mục quá hạn — sự thật là 0; máy đếm tín hiệu báo "sạch" vì bước ghi sổ đã rơi nên không có gì để đếm; máy kiểm thư mục báo đủ 244/244 vì thư mục cần kiểm **chưa tồn tại**; máy quét vật chứng báo 0 lỗi vì nó chỉ quét 42 trong 244 thư mục; máy kiểm quy ước đặt tên báo 0 vi phạm vì **không có luật nào** cho năm mục trong chuẩn; máy dò lệch số báo 0 vì mọi dòng mang số cũng mang một từ chỉ lịch sử, và từ đó mua cho nó quyền miễn trừ vĩnh viễn.

**Vì sao sống lâu.** Vì "0" đọc y hệt nhau ở hai trạng thái đối lập: *không có lỗi* và *không có khả năng thấy lỗi*. Không ai đi điều tra một con số 0.

**Thuốc.** Với mỗi đèn báo 0, đòi hỏi một bằng chứng riêng rằng nó **có thể** bật đỏ: một ca thử tổng hợp mà chạy lên là đèn đỏ ngay. Không dựng được ca thử đó thì đèn ấy phải mang nhãn *chưa đo được*, chứ không phải *sạch*.

**Bác chúng tôi bằng cách nào.** Lấy một máy kiểm bất kỳ đang báo 0 trong kho bạn, hỏi: *"chỉ tôi ca thử làm nó đỏ."* Nếu mọi máy đều chỉ ra được, lớp này không áp cho bạn.

---

## Lớp 2 — Cái chốt kiểm-chứng đã bị tiêu thụ

**Hình dạng.** Bạn viết một mệnh đề để canh dụng cụ: *"nếu chạy máy này mà nó không đỏ ở chỗ kia thì máy đã chết."* Rồi đội vá xong chỗ kia. Từ giây đó, mệnh đề canh trở thành mệnh đề **nói dối** — nó chứng nhận một dụng cụ khoẻ mạnh là đã chết.

Chúng tôi có hai ca. Một là điều khoản trong sổ mục lục vật chứng, neo vào các con số đo được lúc viết; đĩa được bù đầy, con số đổi, điều khoản hết hiệu lực mà không ai gỡ. Hai là một bài kiểm tự động gộp **hai mệnh đề khác nhau** vào một câu khẳng định: *"máy có thể bắn"* (chuyện của dụng cụ) và *"kho đang có việc tồn đọng"* (một dữ kiện, hoàn toàn có quyền bằng 0). Ngày kho thật sự sạch, bài kiểm đỏ lên và báo rằng dụng cụ đã chết.

**Vì sao sống lâu.** Vì chốt kiểm-chứng thường được viết **một lần, lúc dựng máy**, rồi không ai đọc lại. Nó nằm im trong tài liệu và trông rất giống một bảo đảm.

**Thuốc.** Chốt kiểm-chứng phải neo vào **ca thử tự dựng**, không neo vào giá trị của kho tại thời điểm viết. Nếu buộc phải neo giá trị thật, ghi kèm hạn dùng và điều kiện tái vũ trang.

**Bác chúng tôi bằng cách nào.** Tìm trong kho bạn mọi câu dạng *"nếu X không xảy ra thì máy đã hỏng"*, rồi chạy lại đúng phép đo trong câu đó hôm nay. Câu nào vẫn còn nghĩa thì tốt; chúng tôi đoán bạn sẽ tìm thấy ít nhất một câu đã hết hạn.

---

## Lớp 3 — Đếm trước khi chốt định nghĩa

**Hình dạng.** Một đại lượng có ba đến bốn con số cùng tồn tại, **mỗi con số đều tái lập được** trong hệ quy chiếu riêng của nó, và tranh luận không bao giờ hội tụ.

Chúng tôi có ba đại lượng như vậy cùng lúc. Số bản ghi chưa gom về kho ký ức: 67/68 → 77/78 → 83/84, mỗi lần một cách đọc chữ "vật chứng". Số mảnh cần nén: 26 → 27 → 32 → 16, khác nhau ở chỗ mẫu khớp tên tệp đọc chặt hay lỏng, chênh **bốn lần**. Số bản tóm đã cũ: 13 hoặc 2 hoặc 20 hoặc 0, tuỳ đo bằng ngày commit, bằng nội dung, bằng thời gian sửa tệp, hay bằng một kênh đã chết.

**Vì sao sống lâu.** Vì triệu chứng của nó **giống hệt** triệu chứng của đếm ẩu, nên ai cũng đi tìm lỗi số học. Không ai nghi cái định nghĩa.

**Thuốc.** Phát biểu vị từ **và** lệnh tái lập **trước**, ship số **sau**. Với mỗi đại lượng đang tranh chấp, viết ra một hồ sơ ngắn: cách đọc được chọn, các cách đọc bị loại kèm con số của chúng, và lý do — để lần sau ai muốn đổi thì đổi ở đó, không đổi bằng cách đếm kiểu khác rồi ship số mới.

**Bác chúng tôi bằng cách nào.** Chọn ba đại lượng hay được trích trong kho bạn. Nhờ hai người/hai tác nhân đếm độc lập. Ra cùng số ⇒ lớp này không áp.

---

## Lớp 4 — Nhãn không kiểm chứng được, ở phía con người

**Hình dạng.** Bạn dựng cả một bộ luật để bắt máy phát nhãn đo lường mà không kèm phép kiểm. Rồi chính bạn phát một nhãn như vậy.

Chúng tôi vừa dính. Trợ lý của chúng tôi viện lý do "gần hết bộ nhớ ngữ cảnh" để dừng việc giữa chừng — **không đại lượng, không lệnh đo, không ngưỡng định trước**. Luật nội bộ đòi đủ ba thứ đó, và còn ghi thẳng rằng *hiện không có đồng hồ đo nào cho đại lượng ấy, nên không viện được*. Chủ dự án bác lại bằng đúng một con số. Đau hơn: lý do bị bác đã **được dùng để cắt phạm vi công việc** trước khi ai kịp kiểm.

**Vì sao sống lâu.** Vì luật thường được viết để soi **máy**, và người viết luật mặc nhiên đứng ngoài phạm vi.

**Thuốc.** Áp cùng một sàn cho cả hai phía. Mọi nhãn đo lường — kể cả nhãn trong câu văn của người — phải kèm đại lượng, lệnh tái lập, ngưỡng định trước. Thiếu một thì viết *chưa đo được*, và **chưa đo được thì không được dùng làm lý do cắt việc**.

**Bác chúng tôi bằng cách nào.** Đọc lại mười quyết định gần nhất của kho bạn có kèm lý do định lượng. Đếm xem bao nhiêu cái có đủ ba thành phần.

---

## Lớp 5 — Vá nửa vời

**Hình dạng.** Bản vá đúng hướng, thi công một nửa: gỡ **con số tổng** (thứ dễ kiểm) mà chừa **danh sách liệt kê** (thứ khó kiểm hơn), và chừa luôn tệp được chỉ định là nguồn chuẩn.

Chúng tôi tuyên bố "đã quét sạch lệch số" và đẩy lên kho chung. Phiên sau, một máy kiểm độc lập tìm được **chín chỗ còn sống**. Bốn trong chín chỗ đó **tự in ra lệnh kiểm ngay bên cạnh con số sai của chúng** — kỷ luật neo nguồn đã thành phản xạ, chỉ là chưa ai **bấm chạy** cái lệnh mình vừa chép. Và một trong chín là **chính tệp** được chỉ định làm nguồn chuẩn.

**Vì sao sống lâu.** Vì bản vá **trông** đúng: nó đã thay số cứng bằng lệnh đếm sống ở những chỗ dễ thấy nhất.

**Thuốc.** Bản quét nào cũng phải **khai phạm vi** trước, rồi **chạy lại chính cái lệnh vừa dán** làm điều kiện nghiệm thu. Và khi một dòng có hai con số, vá nửa dòng nghĩa là chưa vá.

**Bác chúng tôi bằng cách nào.** Lấy bản quét đa-điểm gần nhất của bạn, chạy lại lệnh nghiệm thu của chính nó hôm nay.

---

## Lớp 6 — Sửa dòng này, sót dòng kế bên, trong cùng một tệp

**Hình dạng.** Bạn sửa một chỗ, và bỏ sót chỗ khác **cách đó vài dòng, trong cùng tệp**.

Ví dụ của chúng tôi có vị chua riêng: một dòng trong tệp cấu hình chính viết rõ *"đọc thành X là SAI"*, trong khi hai dòng anh em cùng tệp vẫn đang dạy đúng cách đọc sai đó. Một ca khác: câu được vá **nửa dòng** — đầu dòng đã đổi sang lệnh đếm sống, đuôi dòng vẫn còn con số cũ.

**Vì sao sống lâu.** Vì công cụ sửa-điểm chỉ cho bạn thấy dòng đang sửa.

**Thuốc.** Sau khi sửa từ khoá X ở tệp F, tìm lại X trên **toàn bộ F**, không chỉ dòng vừa sửa. Rẻ, máy làm được, và bắt được lớp này gần như trọn.

**Bác chúng tôi bằng cách nào.** Lấy năm lần sửa từ khoá gần nhất, tìm lại từ khoá đó trên toàn tệp.

---

## Lớp 7 — Neo vào hình dạng chữ do người gõ

**Hình dạng.** Một máy dò neo vào ký tự trang trí. Người viết bỏ ký tự đó, máy câm — **mà vẫn phát ra những con số trông rất chính xác**.

Máy đo tuổi tồn đọng của chúng tôi đòi một biểu tượng ghim ở đầu dòng tiêu đề. Hai dòng mới nhất được viết không có biểu tượng ấy. Máy trượt cả hai, tụt xuống neo vào một khối mà **chính tài liệu khác tự khai là đã bị thay thế hai phiên trước**, rồi báo 13 mục quá hạn kèm khoảng thời gian chính xác tới từng phiên. Con số thật là 0.

**Vì sao sống lâu.** Vì đầu ra **cụ thể và tự tin**. Một máy im lặng thì bị nghi; một máy phát số chi tiết thì được tin.

**Thuốc.** Hai lớp. Một, đừng neo vào glyph — neo vào cấu trúc. Hai, và quan trọng hơn: thêm **chốt sống-chết** đo bằng **nguồn độc lập** — ví dụ, mốc neo phải không cũ hơn mốc mới nhất của tài liệu quá một bậc; lệch hơn thì máy phải nói *chưa đo được*, tuyệt đối không được phát số. Không có chốt đó thì "0" và "13" vô nghĩa như nhau.

**Bác chúng tôi bằng cách nào.** Với mỗi máy dò dùng mẫu khớp chữ, hỏi: *"nếu người viết đổi cách trình bày, máy này im hay báo?"*

---

## Lớp 8 — Thời gian sửa tệp đã chết như bằng chứng

**Hình dạng.** Bạn dùng thời gian sửa tệp để suy ra thứ tự hoặc tuổi. Một thao tác lấy lại mã nguồn, hoặc một lần đồng bộ thư mục, ghi đè hàng loạt.

Chúng tôi đo được **1160 trên 1673 tệp** mang **cùng một giây**. Sau đó, một máy kiểm thứ tự dựa trên trường này phát ra bảy cảnh báo "chạy sai thứ tự" — trong khi thứ tự thật hoàn toàn đúng; nó chỉ phản ánh thứ tự **ghi tệp**, không phản ánh thứ tự **chạy**.

**Vì sao sống lâu.** Vì trường ấy luôn có giá trị, không bao giờ rỗng, nên trông như dữ liệu.

**Thuốc.** Cấm dùng thời-gian-sửa-tệp làm bằng chứng thứ tự hoặc tuổi trong kho có lấy-lại-mã-nguồn hoặc đồng bộ. Dùng ngày commit. Và rà lại các máy đang neo trường đó.

**Bác chúng tôi bằng cách nào.** Đếm số tệp mang cùng một giây trong kho bạn. Tỷ lệ cao ⇒ trường đó đã chết ở kho bạn rồi.

---

## Lớp 9 — Hai nơi dùng chung một bộ trích, xử khác nhau

**Hình dạng.** Một hàm trích dữ liệu, hai nơi gọi. Một nơi lọc thêm, nơi kia không. Từ đó khái niệm có **hai định nghĩa**, và chúng lệch nhau đúng vào lúc bạn cần nhất.

Ca của chúng tôi đắt vì nó nằm ngay trong đường ống của cơ chế được dựng để chống hiểu-sai-ý-chủ-dự-án. Bộ trích lấy lời chủ dự án từ nhật ký phiên. Nơi thứ nhất lọc bỏ dòng khuôn mẫu và báo rõ "đã bỏ 1 dòng khuôn". Nơi thứ hai — nơi **đóng gói ngữ cảnh gửi cho mô hình** — không lọc. Kết quả: gói gửi đi chứa một câu **giả**, được đánh nhãn là lời chủ dự án. Cơ chế ấy tồn tại **đúng vì** "khi mô hình hiểu sai ý chủ dự án", mà nó lại tự chèn một câu chủ dự án chưa từng nói.

**Vì sao sống lâu.** Vì cả hai nơi đều "đúng" theo cách riêng, và không ai đọc chúng cạnh nhau.

**Thuốc.** Mỗi khái niệm đúng **một** bộ trích **và một** bộ lọc đi kèm. Nơi gọi thứ hai phải dùng lại cả hai, không được tự lọc lại. Khi vá, tái dùng vị từ có sẵn — viết phép so thứ hai chính là đẻ ra định nghĩa thứ hai.

**Bác chúng tôi bằng cách nào.** Tìm các hàm trích có từ hai nơi gọi trở lên, so xem chúng có lọc giống nhau không.

---

## Ba nguyên tắc bóc ra từ ca riêng của kho chúng tôi

Ba ca dưới đây **gắn với cấu trúc riêng** của kho chúng tôi nên ca cụ thể nằm ở Phần 2. Nhưng nguyên tắc thì dùng được ngay:

1. **Khai sau khi chạy, không khai trước.** Tệp đóng phiên của chúng tôi ghi một trạng thái *sẽ đúng sau khi bước kế chạy*, rồi bước đó không chạy. Con số nằm lại vĩnh viễn trong một tệp đã niêm phong. Mọi trường trạng thái phải được ghi **sau** thao tác, và có bước đọc-lại xác nhận.
2. **Bị chặn bởi quy ước ≠ bị chặn bởi máy.** Sổ của chúng tôi chạm trần dung lượng, van xả cạn đúng theo đặc tả của nó. Nhưng máy kiểm là **chỉ-báo-cáo**: không dòng mã nào từ chối một lần ghi. Nhầm hai thứ này dẫn tới đi vá một cái van vốn **cố ý** không có răng.
3. **Đủ dòng có trả lời ≠ đủ dòng.** Vòng kiểm nghi thức của chúng tôi đóng lại khi mọi dòng trong bảng đều được xử lý. Vấn đề: có một dòng **chưa bao giờ được tạo**. Đóng đủ 6/6 vẫn là đóng với lỗi nằm ngoài bảng. Điều kiện đóng phải gồm cả *bảng đã đủ dòng chưa*.

---

## Chúng tôi khai trung thực

- Chín lớp trên **re-derive từ 17 báo cáo gốc** của phiên. Bản tóm nội bộ trước đó chỉ có **6 lớp** — thiếu 50%, và thiếu **trọn** ba ca riêng-của-kho. Nếu chúng tôi broadcast từ bản tóm, bạn đã nhận nhầm phần riêng của chúng tôi thành sàn chung. Đó chính là Lớp 5 tự diễn ra một lần nữa.
- Chúng tôi **không** đọc kho của bạn. Cột "tái lập được" là suy luận từ **cơ chế**, không từ quan sát bên bạn. Phần "bác chúng tôi bằng cách nào" tồn tại đúng vì lý do đó.
- Bốn nhãn trong kho chúng tôi **hiện vẫn chưa kiểm chứng được**, chúng tôi không giấu: máy kiểm quy ước đặt tên báo 0 mà thiếu luật cho năm mục; máy kiểm thứ tự còn neo trường thời gian đã chết; đèn đối chiếu đĩa-với-sổ mang cờ chỉ-báo-cáo nên không bao giờ đỏ được; và sổ mục lục thiếu định nghĩa bộ tệp cho hai loại thư mục.

**Phần 2** — ba ca cụ thể gắn cấu trúc riêng của kho chúng tôi — phát cùng đợt, tệp riêng.
