Đã xóa, đã đo, một luật hỏng
Xóa một file CLAUDE.md nghĩa là gỡ bỏ file hướng dẫn mà Claude Code đọc vào đầu mỗi cuộc hội thoại. Boris Cherny, người tạo ra Claude Code, đã nói trên sân khấu là hãy xóa nó mỗi sáu tháng. Hai mươi hai video nhắc lại lời anh ấy trong bảy tuần. Không video nào mở một repository ra xem.
Bài viết này làm điều mà các video kia không làm: lấy một app thật với một file CLAUDE.md 177 dòng, ba skill, bốn command và một hook, chạy năm tác vụ hằng ngày với file đó và không có nó, rồi đếm. Sau bốn mươi bốn lần chạy, đúng một luật bị hỏng. File này tốn token ở mọi tác vụ, không bao giờ cùng một mức, và một trong các dòng của nó không ai theo được.
Đoạn clip, nguyên văn, và hai câu không phải của anh ấy
Đoạn clip đến từ bài nói của Boris Cherny tại YC Startup School, được ghi hình một ngày sau khi Opus 5 ra mắt. Lời anh ấy: cứ mỗi sáu tháng, xóa CLAUDE.md của bạn, xóa skill của bạn, xóa hook của bạn. Xem model làm gì, nó có thể khiến bạn bất ngờ. Với Opus 5, anh ấy nói, Anthropic thực sự khuyến nghị thử điều đó: model có thể không cần tất cả những hướng dẫn đó nữa.
Ba mươi giây trước đó là lời cảnh báo mà không ai trích dẫn. Anthropic không xóa toàn bộ code base. Họ xóa rất nhiều, và gọi đó là một ablation. Bản transcript viết đầy đủ giữ lại câu đó cho đến hôm nay. Tám mươi phần trăm system prompt của Claude Code đã đi theo hướng đó: xóa hết, đưa từng phần trở lại, đo từng dòng.
Hai câu mà các video phản ứng gán vào miệng anh ấy không có trong bài nói. "Context, mục tiêu, và định nghĩa hoàn thành" không xuất hiện ở đâu cả; gần nhất anh ấy nói là task, guardrail, exit criteria. "Sáu mươi bốn agent viết lại Bun" cũng không phải con số của anh ấy: đó là con số của Jarred Sumner, trong bài viết về Bun. Cherny nói mười một ngày, và khi được hỏi con số, anh ấy đoán là hàng nghìn.
Hai mươi hai video trong bảy tuần trích dẫn đoạn clip. Không video nào chạy thử nghiệm. Vậy nên bài viết này làm đúng những gì anh ấy thực sự mô tả: xóa, đưa từng phần trở lại, đo lường.
Công cụ: ablation, không phải xóa bỏ
Một ablation gỡ từng phần của một cấu hình và đo tác động, thay vì xóa hết rồi đoán. CLAUDE.md được đọc vào đầu mỗi cuộc hội thoại và lại được đọc ở mỗi lượt; skill chỉ tải khi được gọi. Sự khác biệt đó chính là điều được đo.
Anthropic cung cấp sẵn công tắc xóa: một cờ đơn giản, cùng biến mà Cherny nhắc đến trên sân khấu. Repository là một app thật của tôi: 177 dòng hướng dẫn, ba skill, bốn command, và một hook kích hoạt ở mỗi lần tìm kiếm.
| Chiều đo | Giá trị |
|---|---|
| Tác vụ hằng ngày | 5 (component mới, chỉnh sửa, refactor, thay đổi store, câu hỏi kiến trúc) |
| Cấu hình | 5 (đầy đủ, không file, không skill, không hook, không gì cả) |
| Model | một, cố định |
| Môi trường | thư mục config trống, clone mới trước mỗi lần chạy |
| Lượt chạy | 44 |
| Chi phí | $39 |
Mỗi lượt chạy được chấm điểm theo cùng một cách, trên cùng một bản clone, bằng một script thay vì bằng tay. Điều tính là hỏng: các luật riêng của repository (import, kiểu dữ liệu, design token, bản dịch) cộng với typecheck và lint.
Công cụ duy nhất được xây cho loại ablation này, Caliper, gỡ skill và MCP server nhưng không đụng vào file; việc hoán đổi CLAUDE.md được làm bằng tay. Giới hạn, nói một lần: một repository, một model, hai lượt chạy cho mỗi ô, không có transcript. Kết quả đầu tiên định giọng điệu: tác vụ refactor cho kết quả giống hệt nhau, sáu mươi bốn cent với file và sáu mươi ba cent không có file.
Cái gì hỏng: một luật, trên file mới
Luật bị hỏng là một luật về bản địa hóa (internationalisation), theo đúng lời trong file: luôn thêm cả tiếng Anh và tiếng Pháp, không bao giờ hard-code một chuỗi mà người dùng nhìn thấy. Ở tác vụ component mới, khi có file, cả bốn lượt chạy đều viết file bản dịch. Khi không có file, ba trên bốn lượt hard-code phần tiêu đề. Cùng một tác vụ, cùng một repository, cùng một model, cùng một prompt.
| Component mới | Đã viết file bản dịch |
|---|---|
| Có CLAUDE.md | 4/4 |
| Không có CLAUDE.md | 1/4 |
Tác vụ edit cho thấy nửa còn lại của câu chuyện. Mọi cấu hình đều làm đúng, kể cả khi không có gì, bởi vì code xung quanh đã dạy sẵn: mọi component bên cạnh component được chỉnh sửa đều đã có file bản dịch. Mọi thứ khác đều giữ vững trong cả bốn mươi bốn lượt chạy: alias import, type thay vì interface, design token, pattern của store. Code thể hiện những điều đó, file chỉ lặp lại chúng.
Một bài báo từ ETH Zurich đo cùng một điều đó trên 138 issue thật. Kết luận của họ: các context file không cải thiện tỷ lệ thành công và tốn thêm khoảng hai mươi phần trăm chi phí, dù model có tuân theo các hướng dẫn. Một lưu ý: một lượt chạy không có file vẫn viết file bản dịch. Luật này không phải bất khả thi khi thiếu file, nó chỉ không đáng tin cậy. Một luật hỏng, đúng cái luật mà code không thể tự dạy. Và lượt chạy bỏ qua công việc đó cũng là lượt rẻ nhất.
File này tốn gì, theo từng tác vụ
Chi phí token của một CLAUDE.md là hiệu số token đọc được giữa một lượt chạy có file và cùng lượt chạy đó không có file.
| Tác vụ | Ít token đọc hơn khi không có file |
|---|---|
| Component mới | 61% |
| Edit | 15% |
| Refactor | 5% |
| Thay đổi store | 4% |
| Câu hỏi kiến trúc | 14% |
| Trên mười lượt chạy | 32% token, 22% tiền |
Ba mươi hai phần trăm là con số mà mọi video sẽ giật tít, và đó là con số sai. Khoản tiết kiệm lớn nhất đến từ lượt chạy không viết file bản dịch: rẻ hơn vì làm ít việc hơn. Ở nơi kết quả giống hệt nhau, file tốn từ bốn đến mười bốn phần trăm. Đó mới là cái giá thực của nó, và con số hai mươi phần trăm của bài báo nằm đúng giữa hai con số này.
Cơ chế này tốn khoảng 1.800 token, được đọc lại ở mỗi lượt. Skill, hook và knowledge graph không tạo ra gì đo được, dù có mặt hay không. Nhiễu còn lớn hơn hầu hết những con số đó: cùng một tác vụ với cùng một file tốn $2.11 ở một lượt chạy và $1.33 ở lượt khác. Hai lượt chạy chạm trần lượt (turn cap), một lượt có file và một lượt không có. Vậy nên file này tốn một chút ở khắp mọi nơi và chỉ đáng giá đúng một lần, trừ khi nó cũng nói dối.
Những dòng nói dối
Một dòng nói dối là một hướng dẫn mà model không thể theo hoặc không thay đổi gì cả. Dòng được nhắc đến ở đầu bài: import theme từ alias design-tokens. Alias đó không tồn tại: file cấu hình TypeScript chỉ map một prefix, và thư mục tokens không có file theme nào. Mọi lượt chạy, có file hay không, đều làm giống như code xung quanh, cùng một dòng import bốn mươi bốn lần.
File này có tám mươi hai dòng tổng quan kiến trúc. Cùng một câu hỏi, sáu câu trả lời: cả sáu đều tìm ra cùng chín file, từ backend đến màn hình, theo cùng một thứ tự, với hoặc không có phần tổng quan. Một đoạn trỏ tới một knowledge graph mà bản clone không có. Khi có knowledge graph, câu hỏi vẫn tốn y như vậy.
| Đo lường | Giá trị |
|---|---|
| Quy tắc kích thước của Anthropic | dưới 200 dòng |
| File này | 177 dòng |
| File trung vị trong tập dữ liệu 30.000 repo của reporails | 50 mục, 12 chỉ thị |
| Dòng chỉ thị trong file này | 24/177 |
Vị trí quyết định luật nào trong hai luật xung đột sẽ thắng, và model không bao giờ nói ra điều đó, chênh khoảng chín mươi điểm trong một bài test của một nhà cung cấp. Phần tổng quan có thể giúp ích cho một tác vụ chưa được chạy ở đây: một lần thử, một câu trả lời. Vậy là ba loại dòng: loại xứng đáng có mặt, loại mà code đã dạy sẵn, loại nói dối.
Giữ, chuyển, xóa: danh sách ngắn
Ba đống, và phép đo đứng sau mỗi đống.
| Đống | Cái gì thuộc về đó | Phép đo |
|---|---|---|
| Giữ | Luật mà code không thể tự thể hiện | 6 dòng cứu 4 lượt chạy |
| Chuyển | Tổng quan kiến trúc và các command | 107 dòng không có lợi ích đo được |
| Xóa | Những dòng nói dối, và những dòng mà cây thư mục đã cho thấy sẵn | 44 lượt chạy giống hệt nhau |
Giữ lại những gì model từng làm sai hai lần: đó chính là tiêu chí của Anthropic cho file này. Chuyển phần tổng quan và các command vào một cây file chỉ tải khi cần; bài viết tháng Bảy của Anthropic gọi kho tài liệu trung tâm là một huyền thoại. Hook thì ở lại: một gate không hết hạn khi model tốt hơn. Cắt bỏ phần văn xuôi mà nó đã vượt qua, giữ lại gate.
File sau khi rút gọn: khoảng bảy mươi dòng, cộng thêm sáu dòng đã chứng minh giá trị. Đó là phương pháp của Cherny, đọc đầy đủ: xóa, đưa từng phần trở lại, đo lường. Một repository, một model, hai lượt chạy cho mỗi ô; các đống của bạn sẽ khác, nhưng phương pháp thì không. Việc xóa file tốn một luật và tiết kiệm được rất ít. Tìm ra những dòng nói dối mới là phần thắng.
AIDive