Skill và Subagent

Skill là tri thức, được nạp vào context khi cần. Subagent là một context riêng, được giao việc rồi biến mất. Cùng một mô hình đó, mỗi tool gọi tên khác nhau và hiện thực khác nhau, từ Claude Code đến GitHub Copilot, Cursor, Codex CLI.

Ví dụ cụ thể, gõ một câu lệnh vào Claude Code, ngay lập tức có ít nhất hai cơ chế chạy phía sau. Một là skill, tri thức được nạp khi cần. Hai là subagent, một phiên bản Claude tách biệt, được giao một việc cụ thể rồi biến mất.

Skill nạp vào context như thế nào progressive disclosure

Một skill là một folder, chứa SKILL.md và tùy chọn thêm scripts/references/assets/. Cách nó vào context chia làm ba giai đoạn.

  • Discovery: lúc khởi động session, chỉ name và description của mỗi skill được nạp, vài chục token mỗi cái.
  • Activation: khi một task khớp với description, toàn bộ body của SKILL.md được nạp vào context.
  • Execution: script hay reference file bên trong skill chỉ được đọc khi thật sự cần.
Ba giai đoạn nạp một skill, mỗi giai đoạn tốn nhiều token hơn giai đoạn trước

Cấu trúc một skill trong thực tế SKILL.md

Một skill không chỉ là một file. Nó là một folder, SKILL.md bắt buộc, còn scripts/references/assets/ tùy chọn, thêm vào khi skill cần mang theo tài liệu tham khảo hoặc script chạy sẵn. Ví dụ dưới đây là một skill tự gọi nhiều subagent song song, đúng phần đang quan tâm:

.claude/skills/deep-review/SKILL.md

---
name: deep-review
description: Use when a pull request needs a full review before merge. Runs security, performance, and style checks in parallel and merges the findings into one report.
allowed-tools: Read, Grep, Bash(git diff:*), Task
---
# Deep Review
1. Run `git diff main...HEAD` to get the full changeset.
2. Spawn three subagents in parallel, one per concern:
- security-reviewer: injection risks, broken auth, leaked secrets
- performance-reviewer: N+1 queries, unbounded loops, blocking I/O
- style-reviewer: naming, dead code, missing test coverage
3. Wait for all three summaries to return.
4. Merge the findings into one report, ranked by severity, duplicates removed.
5. Post the report as a PR comment.

allowed-tools ở đây có thêm Task, đây là tool dùng để spawn subagent. Không có Task, bước 2 không thực hiện được, skill chỉ có thể đọc và chạy git diff như một skill thường.

Ai quyết định gọi skill nào trigger

Không có embedding, không có classifier, không có regex ở tầng code. Toàn bộ danh sách skill được gộp thành một meta-tool tên Skill, và chính forward pass của model, đọc qua từng description, quyết định skill nào khớp với việc đang làm. description vì vậy là phần quan trọng nhất trong SKILL.md, quan trọng hơn cả nội dung bên trong.

Một skill gọi skill khác chaining

Cơ chế đó lặp lại ngay cả khi một skill đang chạy. Trong framework Superpowers, skill brainstorming có một dòng chỉ thị viết thẳng trong body, chỉ được gọi writing-plans sau khi brainstorming xong, không được gọi bất kỳ skill implementation nào khác. writing-plans sau đó chỉ định bước tiếp theo, dùng subagent-driven-development hoặc executing-plans. Đây không phải function call, chỉ là câu chữ nằm trong context hiện tại, và model tự quyết định làm theo.

Mỗi bước gọi bước kế tiếp bằng tên, viết ngay trong SKILL.md body

Subagent khác gì isolation

Subagent là một Claude instance riêng, có context window riêng, không mang theo lịch sử của session gọi nó. Skill chạy chung context với người gọi, subagent thì tách biệt hoàn toàn, và giới hạn quyền của nó được enforce ở tầng tool permission, không phải ở lời văn.

.claude/agents/security-reviewer.md

---
name: security-reviewer
description: Security-focused code reviewer. Use proactively after writing authentication, authorization, or data-handling code, or on request such as "check this for security issues."
tools: Read, Grep, Glob, Skill
model: opus
---
You are a senior application security reviewer.
Before reviewing, load the owasp-checklist skill for the current OWASP Top 10 criteria.
Review the code path for:
- injection risks (SQL, command, template)
- broken authentication or session handling
- missing authorization checks on sensitive endpoints
- secrets committed to source
Do not modify code. Report findings as a severity-ranked list with file and line references.

Khác với skill, subagent dùng tools chứ không phải allowed-tools, đây là danh sách công cụ được cấp, không phải giới hạn thêm lên tool sẵn có của session. tools ở đây có thêm Skill, và system prompt yêu cầu subagent tự nạp skill owasp-checklist trước khi review, đây chính là lúc một subagent gọi skill bên trong context riêng của nó.

Ba cách để có một subagent /agents

Không phải lúc nào cũng phải tự tay viết file markdown như ví dụ trên. Có ba cách, tùy mức độ kiểm soát muốn giữ.

  • Tự viết tay. Tạo file trong .claude/agents/, đi theo repo, cả team dùng chung, hoặc ~/.claude/agents/, đi theo cá nhân qua mọi project. Kiểm soát toàn bộ nội dung, đúng như ví dụ security-reviewer.md ở trên.
  • Nhờ Claude viết. Chạy lệnh /agents, chọn Generate with Claude, mô tả bằng lời việc cần, ví dụ “a code reviewer that checks for security vulnerabilities and performance issues”. Claude tự soạn toàn bộ file, name, description, tools, model, system prompt, rồi lưu đúng path. Vẫn là một file thật, sửa lại được sau đó, chỉ khác ai gõ bản đầu tiên.
  • Claude tự tạo ngay lúc chạy, không lưu file. Từ giữa 2026, Dynamic Workflows cho phép lead agent tự lên kế hoạch và fan-out hàng chục đến hàng trăm subagent song song trong một session, không cần định nghĩa trước. Những subagent này chỉ sống cho đúng task đó, không để lại file nào trong .claude/agents/.

Ngoài ra Claude Code có sẵn ba subagent mặc định, không cần định nghĩa gì. Explore, chỉ đọc, chạy trên Haiku, chuyên tìm kiếm trong codebase. Plan, chỉ đọc, dùng trong plan mode để thu thập ngữ cảnh trước khi đề xuất chiến lược. General-purpose, đầy đủ quyền, kế thừa model và tool của session chính, dùng cho việc phức tạp nhiều bước.

Một tầng cao hơn subagent là agent teams, tính năng thực nghiệm. Khác biệt tóm gọn thế này, subagent là một lời gọi hàm, agent teams là một tổ chức, nhiều agent thật sự phối hợp với nhau chứ không chỉ nhận task và trả kết quả một chiều như phần vòng đời dưới đây.

Tổ chức skill và subagent trong một project layout

Ghép ba ví dụ ở trên lại thành một project thật, agents/ và skills/ đứng ngang hàng dưới .claude/, cả hai nằm trong repo nên cả team dùng chung, version control theo dõi thay đổi như bất kỳ file code nào khác.

my-project/
├── .claude/
│ ├── agents/
│ │ ├── security-reviewer.md
│ │ ├── performance-reviewer.md
│ │ └── style-reviewer.md
│ └── skills/
│ ├── deep-review/
│ │ └── SKILL.md
│ ├── pr-description-writer/
│ │ └── SKILL.md
│ └── owasp-checklist/
│ ├── SKILL.md
│ └── references/
│ └── top-10-2025.md

owasp-checklist có thêm references/, đúng với điểm ở trên, skill không chỉ có SKILL.md khi cần mang theo tài liệu dài. Ba subagent trong agents/ là ba vai deep-review gọi tới, còn security-reviewer lại quay sang dùng owasp-checklist, đóng vòng giữa hai lớp.

Vòng đời đầy đủ, từ session đến subagent và ngược lại lifecycle

Ghép skill và subagent lại, một vòng chạy điển hình trông như sau. Session kích hoạt một skill, skill chạy chung context với session. Đến bước cần cô lập, ví dụ chạy song song ba việc độc lập, skill giao task cho một subagent. Subagent khởi động với context riêng, không mang gì từ session sang. Bên trong context đó, subagent có thể tự kích hoạt một skill khác, qua đúng cơ chế Skill tool mà session vẫn dùng. Subagent hoàn thành, trả một bản tóm tắt về session, rồi biến mất.

deep-review giao task cho security-reviewer, security-reviewer nạp owasp-checklist trong context riêng, rồi trả findings về session

Field skills trong frontmatter của subagent còn cho phép preload sẵn nội dung một skill cụ thể ngay lúc khởi động, thay vì để subagent tự tìm ở bước 04. Và nếu tools của subagent không có Skill trong allowlist, bước 04 không xảy ra được, subagent bị khóa lại đúng bằng system prompt của nó.

Bên ngoài Claude Code Copilot · Cursor · Codex

SKILL.md là chuẩn mở, cùng một file chạy được trên nhiều tool mà không cần sửa. Lớp subagent thì ngược lại, mỗi tool tự đặt tên và tự định dạng riêng.

ToolSkill (SKILL.md)Subagent / custom agent
Claude CodeĐầy đủ. ~/.claude/skills/ (cá nhân), .claude/skills/ (project)subagent, .claude/agents/*.md, frontmatter name/description/tools/model
GitHub CopilotĐầy đủ. .github/skills/ (project, theo dõi trong version control)custom agent, .github/agents/*.agent.md (repo) hoặc agents/ (tổ chức)
CursorĐầy đủ từ bản 2.4, marketplace đầu 2026. .cursor/skills/, chỉ project, chưa có path cá nhânsubagent có sẵn cho research codebase, chạy terminal, chạy song song, cộng subagent tự định nghĩa
Codex CLI (OpenAI)Đầy đủ. ~/.codex/skills/ (cá nhân), .codex/skills/ (project), thêm openai.yaml cho UI metadatacustom agent, file TOML trong ~/.codex/agents/, mỗi file một agent, field name là identity để match khi spawn
Gemini CLI (Google)Đầy đủ. ~/.gemini/skills/ (cá nhân), .gemini/skills/ (project)chưa chuẩn hóa rõ ràng như ba tool trên

Ví dụ custom agent bên Codex CLI:

.codex/agents/security-auditor.toml

name = "security-auditor"
description = "Audits code changes for security vulnerabilities"
model = "gpt-5.5"
[sandbox]
permissions = "read-only"

Cùng ý tưởng với security-reviewer bên Claude Code, persona riêng, model riêng, quyền bị khóa ở mức sandbox. Chỉ khác cú pháp, TOML thay vì YAML frontmatter.


Chọn cái nào

Chọn skill khi công việc lặp lại, không cần cô lập context, không cần phân quyền riêng biệt. Chọn subagent khi cần một context sạch, cần giới hạn tool cứng, hoặc cần chạy song song nhiều việc độc lập. Phần lớn công việc rơi vào nhóm đầu. Trong các repo public, chỉ khoảng một phần tư có định nghĩa subagent riêng, và trong nhóm đó, số lượng trung vị là sáu agent, không phải hàng chục hay hàng trăm.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.