DEV Community

BeanBean
BeanBean

Posted on • Originally published at nextfuture.io.vn

Claude Code Skill: 2 Lỗi Ngầm Đốt Token Và Phá Quyền Bash

Originally published on NextFuture

Bạn gõ một câu hỏi ngắn về giá API vào Claude Code, chạy /context theo thói quen, và thấy 30% cửa sổ ngữ cảnh 1 triệu token đã biến mất chỉ sau một câu hỏi. Trên máy thứ hai, con số này là 40%. Bài viết này chỉ đúng nguyên nhân của lỗi đốt token đó và một lỗi thứ hai — allowed-tools hết hạn sau một turn — để bạn dừng bị bất ngờ bởi cả hai.

Lỗi 1: nhắc tên model Claude là kích hoạt cả gói tài liệu

Một kỹ sư gõ câu hỏi "does fable use api billing?" vào Claude Code rồi chạy /context ngay sau đó. Kết quả: 295k token biến mất chỉ sau một câu hỏi, tương đương 30% cửa sổ ngữ cảnh 1 triệu token. Chạy đúng câu hỏi đó trên laptop thứ hai, con số nhảy lên 354k token — cùng câu hỏi, cùng câu trả lời, chênh nhau gần 100k token.

Thử nghiệm đối chứng cho thấy câu hỏi tra cứu thông thường rất rẻ: hai câu hỏi kiểm tra ("Node LTS mới nhất là gì?" và "MIT vs Apache 2.0?") trong session mới tốn tổng cộng chỉ 7,5k token. Nguyên nhân bùng nổ token nằm ở một điểm cụ thể: câu hỏi có nhắc tên một model Claude, kích hoạt skill claude-api tích hợp sẵn. Skill này không phân biệt trọng lượng câu hỏi — một câu hỏi giá cả đơn giản nhận đúng gói tài liệu hàng trăm KB giống như khi bạn yêu cầu triển khai một streaming tool-use loop.

Chi phí cố định mà nhiều người lo lắng — MCP server, skill, memory file — lại gần như miễn phí: 59 MCP tool nằm ở mức 0 token vì Claude Code trì hoãn tải schema đến khi thực sự dùng, và 16 mô tả skill cộng lại chỉ tốn 2,2k token. Toàn bộ phần đốt token nằm trong danh mục Messages, nơi tài liệu của claude-api bị nhồi vào như một tin nhắn duy nhất.

Lỗi 2: allowed-tools chỉ cấp quyền cho một turn, không phải cả session

Bạn thêm allowed-tools: Bash(git add *) Bash(git commit *) vào skill, gõ /commit, Claude commit thẳng không hỏi. Gửi thêm một tin nhắn yêu cầu commit lần nữa — permission prompt quay lại. Không có gì hỏng: allowed-tools làm đúng như thiết kế, chỉ là phạm vi hẹp hơn cái tên gợi ý.

allowed-tools cấp quyền trước cho các tool được liệt kê chỉ trong turn gọi skill đó. Tài liệu nói rõ quyền này "clears when you send your next message" — biến mất ngay khi bạn gửi tin nhắn kế tiếp. Gọi lại skill sẽ áp dụng lại quyền cho turn mới. Trong khi đó, nội dung SKILL.md được render vào conversation như một tin nhắn và tồn tại suốt phần còn lại của session — đây là lý do hai câu tưởng như mâu thuẫn đều đúng: skill vẫn được load, nhưng quyền đã hết hạn.

Một hiểu lầm phổ biến khác: allowed-tools không phải hàng rào. Nó không hạn chế tool nào được dùng — mọi tool vẫn khả dụng, và permission settings của bạn vẫn chi phối các tool không nằm trong danh sách. Nếu cần thực sự khóa một tool trong lúc skill đang chạy, field đúng là disallowed-tools — field này loại tool khỏi pool khả dụng, và cũng hết hạn cùng lúc với allowed-tools ở tin nhắn kế tiếp.

Cách khắc phục cho từng lỗi

Với lỗi đốt token: nếu câu hỏi chỉ cần tra giá/billing, diễn đạt lại để không nhắc trực tiếp tên model Claude — câu hỏi không chứa tên model sẽ không kích hoạt claude-api skill. Theo dõi /context sau các câu hỏi có nhắc model để phát hiện sớm khi payload tài liệu bị nhồi vào ngoài ý muốn.

Với lỗi quyền: nếu bạn thấy mình muốn allowed-tools tồn tại suốt session thay vì một turn, đó là dấu hiệu quy tắc đó thuộc về permission settings, không phải frontmatter của skill. Nguyên tắc chia việc: allowed-tools/disallowed-tools trong SKILL.md dành cho lần gọi này; allow rules trong settings project/user dành cho toàn session hoặc toàn project; deny rules trong settings dùng khi muốn khóa một tool ở mọi nơi, không chỉ trong một skill.

Với skill có script riêng, Claude Code thay thế biến ${CLAUDE_SKILL_DIR} ở cả nội dung markdown và Bash rule trong allowed-tools — dùng cùng biến này ở cả hai nơi để allow rule khớp đúng lệnh mà skill thực thi, tránh hardcode path sẽ hỏng khi skill được cài ở vị trí khác. Với plugin skill, biến này chỉ trỏ vào thư mục con của skill, không phải root của plugin, nên đoán đường dẫn còn rủi ro hơn.

Điều cần theo dõi tiếp

Nếu team bạn dùng Claude Code cho automation dài (CI, background agent), audit lại mọi skill có allowed-tools để xác định quyền nào cần bền vững qua nhiều turn — đó là ứng viên nên chuyển sang settings thay vì dựa vào frontmatter. Đồng thời kiểm tra /context định kỳ sau các câu hỏi ngắn có nhắc tên model, trước khi phần token bị nhồi thêm ảnh hưởng đến ngân sách của một session dài.


This article was originally published on NextFuture. Follow us for more fullstack & AI engineering content.

Top comments (0)