Claude Code từ zero đến thành thạo · Phần 19 — Headless, deep link, chạy theo lịch và goal
Chạy Claude Code không tương tác: cờ -p, ba định dạng output, bare mode, JSON schema. Cộng deep link claude-cli://, ba lựa chọn chạy theo lịch, và /goal — bắt Claude làm tiếp tới khi một điều kiện đo được thoả.
Chặng cuối gom bốn phần còn lại. Bài này về tự động hoá: chạy Claude Code từ script, mở phiên bằng link, chạy theo lịch, và bắt nó làm tiếp tới khi một điều kiện đo được thoả.
Chế độ không tương tác
Thêm cờ -p (hoặc --print) vào bất kỳ lệnh claude nào để chạy nó không tương tác:
claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"
Claude Code thoát với code 0 khi thành công và code khác 0 khi lượt chạy fail, nên script của bạn rẽ nhánh theo exit status được. Truyền một cờ không hợp lệ thì nó báo lỗi ra stderr trước khi lượt chạy bắt đầu; còn một thất bại bên trong lượt chạy, ví dụ thiếu xác thực, thì được in ra stdout như là kết quả.
Không phải cờ nào cũng kết hợp được với -p: Claude Code từ chối --bg, và từ chối --cloud kèm mô tả task.
Bare mode
Thêm --bare để giảm thời gian khởi động bằng cách bỏ qua việc tự phát hiện hook, skill, plugin, MCP server, auto memory, và CLAUDE.md.
Bare mode hữu ích cho CI và script, nơi bạn cần cùng một kết quả trên mọi máy. Một hook trong
~/.claudecủa đồng nghiệp hoặc một MCP server trong.mcp.jsoncủa project sẽ không chạy, vì bare mode không bao giờ đọc chúng.
Và đây là lý do bảo mật quan trọng hơn:
Không có
--bare, Claude Code chạy hook trong.claude/settings.jsoncủa một project ngay cả ở thư mục bạn chưa bao giờ tin tưởng — vì phiên-pkhông hiện hộp thoại workspace trust. Nó cũng nối các server trong.mcp.jsoncủa project, vì phiên-pcũng không hiện được prompt duyệt từng server.
claude --bare -p "Summarize README.md" --allowedTools "Read"
Trong bare mode, Claude Code không bao giờ đọc credential OAuth hay keychain của hệ thống. Với Anthropic API, đặt ANTHROPIC_API_KEY trong môi trường. Bare mode chỉ cho Claude bộ tool Bash, đọc file và sửa file; muốn nạp thêm gì thì truyền cờ:
| Muốn nạp | Dùng |
|---|---|
| Bổ sung system prompt | --append-system-prompt, --append-system-prompt-file |
| Settings | --settings <file-or-json> |
| MCP server | --mcp-config <file-or-json> |
| Custom agent | --agents <json> |
| Một plugin | --plugin-dir <path>, --plugin-url <url> |
--barelà mode được khuyến nghị cho lời gọi từ script và SDK, và sẽ trở thành mặc định của-pở một bản phát hành tương lai.
Đổ dữ liệu qua Claude
Chế độ không tương tác đọc stdin, nên bạn đổ dữ liệu vào và chuyển hướng phản hồi ra như mọi công cụ dòng lệnh:
cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt
Stdin bị chặn ở 10MB. Vượt trần thì Claude Code thoát với lỗi rõ ràng và status khác 0. Muốn xử lý input lớn hơn thì ghi nội dung ra file và nhắc đường dẫn file trong prompt thay vì đổ vào qua ống.
Một ví dụ thực dụng — dùng Claude làm linter riêng của project, đặt trong package.json:
{
"scripts": {
"lint:claude": "git diff main | claude -p \"you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.\""
}
}
Đổ diff vào qua ống nghĩa là Claude không cần quyền Bash để đọc nó — một mẹo nhỏ nhưng giảm hẳn số quyền phải cấp.
Ba định dạng output
text(mặc định) — text thuầnjson— JSON có cấu trúc kèm result, session ID, và metadatastream-json— JSON phân tách bằng dòng mới, cho streaming thời gian thực
claude -p "Summarize this project" --output-format json
Với --output-format json, payload phản hồi gồm total_cost_usd và phân rã chi phí theo từng model — nên script theo dõi được chi tiêu mỗi lần gọi mà không phải mở dashboard. Cả hai con số là ước lượng phía client và có thể khác hoá đơn thật.
Output theo schema — dùng --output-format json cùng --json-schema. Kết quả có cấu trúc nằm ở trường structured_output:
claude -p "Extract the main function names from auth.py" \
--output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'
Nếu giá trị không phải JSON Schema hợp lệ, claude thoát với Error: --json-schema is not a valid JSON Schema kèm chẩn đoán của validator. Claude Code nhận schema dùng từ khoá format nhưng coi nó là annotation và không cưỡng chế.
Parse bằng jq:
claude -p "Summarize this project" --output-format json | jq -r '.result'
Streaming
claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages
Dòng cuối của stream là một tin nhắn result chứa text phản hồi cuối, chi phí, và metadata phiên.
Lọc lấy riêng phần text đang stream:
claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \
jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'
Theo dõi tin nhắn của subagent: tin nhắn từ subagent xuất hiện trong stream với trường parent_tool_use_id là ID của tool call sinh ra nó; tin nhắn từ hội thoại chính mang null ở trường đó. Mặc định Claude Code chỉ phát block tool_use và tool_result của subagent — truyền --forward-subagent-text để phát cả text và thinking block.
Bắt lỗi CI khi plugin hay MCP server không nạp được: sự kiện system/init mang hai trường plugins và plugin_errors, cùng mcp_servers và mcp_server_errors. Các khoá *_errors bị bỏ đi khi không có lỗi, nên một cổng CI fail được trên một mảng không rỗng.
Tự động duyệt tool
claude -p "Run the test suite and fix any failures" \
--allowedTools "Bash,Read,Edit"
Với -p, permission mode khởi động dựng sẵn là Manual trên mọi gói — nên hãy truyền mode bạn muốn: --permission-mode auto để classifier duyệt thay bạn; dontAsk cho lượt chạy CI bị khoá chặt; acceptEdits để Claude ghi file không cần hỏi.
Cờ --allowedTools dùng cú pháp permission rule (phần 7):
claude -p "Look at my staged changes and create an appropriate commit" \
--allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"
Khoảng trắng trước
*là quan trọng: không có nó thìBash(git diff*)cũng khớpgit diff-index.
Tiếp tục hội thoại
# Lần đầu
claude -p "Review this codebase for performance issues"
# Tiếp tục hội thoại gần nhất
claude -p "Now focus on the database queries" --continue
Chạy nhiều hội thoại thì bắt session ID để resume đúng cái:
session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"
Bạn chạy hai lệnh này từ hai thư mục khác nhau được — Claude Code tìm phiên theo ID ở mọi project trên máy.
Task nền lúc thoát
Nếu Claude khởi động một background Bash task trong lượt chạy -p, ví dụ một dev server, shell đó bị kết thúc khoảng năm giây sau khi Claude trả kết quả cuối và stdin đóng. Khoảng ân hạn đó để một task xong ngay sau kết quả vẫn kịp giao output.
Background subagent và workflow được miễn khoảng ân hạn năm giây vì kết quả của chúng là phần của output cuối — nên claude -p chờ chúng hoàn thành. Việc chờ đó bị chặn trên ở mười phút mặc định để một agent nền bị treo không giữ tiến trình mở vô hạn.
Dừng bằng SIGTERM thì Claude Code huỷ lượt đang chạy, kết thúc cây tiến trình của lệnh Bash đang chạy, chạy hook SessionEnd, và thoát với code 143.
Deep link: mở phiên từ một URL
Một deep link là URL dạng claude-cli:// mở Claude Code trong một cửa sổ terminal mới. URL đó mang được một thư mục làm việc và một prompt để điền sẵn.
Deep link không bao giờ tự thực thi gì. Link chỉ chọn một thư mục và điền vào ô prompt. Kể cả khi bạn click một link từ trang không tin cậy, prompt vẫn trơ: không gì tới tay model cho tới khi bạn đọc thứ được điền vào và bấm
Enter.Khi phiên mở ra, một dòng cảnh báo dưới ô nhập ghi
Prompt from an external linkvà nằm đó tới khi bạn gửi hoặc xoá prompt. Với prompt dài hơn 1.000 ký tự, cảnh báo kèm số ký tự và nhắc bạn cuộn xem hết trước khi bấmEnter— vì prompt dài đẩy được chỉ dẫn ra ngoài màn hình.
Mọi deep link bắt đầu bằng claude-cli://open, rồi tới các tham số query:
| Tham số | Mô tả |
|---|---|
q | Text điền sẵn vào ô prompt. Phải URL-encode. Dùng %0A cho dòng mới. Tối đa 5.000 ký tự |
cwd | Đường dẫn tuyệt đối làm thư mục làm việc. Path mạng và UNC bị từ chối, và path chứa ký tự điều khiển vô hình hoặc bidirectional cũng vậy |
repo | Một slug GitHub dạng owner/name. Claude Code giải nó về một bản clone cục bộ nó đã thấy trước đó. Không có clone khớp thì phiên mở ở thư mục home |
Truyền cả hai thì cwd thắng và repo bị bỏ qua, kể cả khi path cwd không tồn tại.
Dùng cwd khi mọi người click link đều có project ở cùng một đường dẫn tuyệt đối, ví dụ một devcontainer chuẩn hoá. Dùng repo khi link được chia sẻ và mỗi người clone vào chỗ khác nhau — Claude Code ghi lại đường dẫn mỗi lần bạn chạy claude trong một git repo, và repo mở bản bạn làm việc gần nhất.
Ví dụ trong một runbook sự cố:
## High 5xx rate on web-gateway
1. Acknowledge the page in PagerDuty.
2. [Open Claude Code in the gateway repo](claude-cli://open?repo=acme/web-gateway&q=5xx%20rate%20is%20elevated%20on%20web-gateway.%20Check%20recent%20deploys%2C%20error%20logs%20from%20the%20last%2030%20minutes.)
3. Post initial findings in #incident.
Mở từ shell:
open "claude-cli://open?repo=acme/payments&q=review%20open%20PRs" # macOS
xdg-open "claude-cli://open?repo=acme/payments&q=review%20open%20PRs" # Linux
Handler được đăng ký khi bạn gửi prompt đầu tiên của một phiên tương tác — không phải khi cài đặt, và không phải khi chỉ mở rồi thoát. Đăng ký chỉ ghi vào vị trí cấp user. Ngăn hẳn việc đăng ký bằng disableDeepLinkRegistration đặt thành "disable" trong settings.json.
Ba vấn đề hay gặp: click link không có gì xảy ra → handler chưa được đăng ký, hãy chạy một phiên tương tác và gửi một prompt trước. Link hiện thành text thuần → GitHub-rendered Markdown strip mọi scheme khác http/https, nên claude-cli:// mất link; giải pháp là đặt link trong code block để người đọc copy vào address bar. Phiên mở ở home thay vì repo → tham số repo chỉ giải được về clone Claude Code đã thấy; hãy chạy claude trong clone đó một lần, hoặc chuyển sang cwd.
Ba lựa chọn chạy theo lịch
| Cloud (Routines) | Desktop | /loop | |
|---|---|---|---|
| Chạy ở | Cloud, mặc định do Anthropic quản | Máy của bạn | Máy của bạn |
| Cần máy bật | Không | Có | Có |
| Cần phiên đang mở | Không | Không | Có |
| Sống qua restart | Có | Có | Chỉ khôi phục khi --resume nếu chưa hết hạn |
| Truy cập file cục bộ | Không (clone mới) | Có | Có |
| Prompt hỏi quyền | Không (chạy tự chủ) | Cấu hình được theo từng task | Kế thừa từ phiên |
| Khoảng thời gian tối thiểu | 1 giờ | 1 phút | 1 phút |
Dùng cloud task cho việc phải chạy đáng tin cậy mà không cần máy bạn. Dùng Desktop task khi cần truy cập file và tool cục bộ. Dùng /loop cho việc kiểm tra định kỳ nhanh trong một phiên.
/loop
| Bạn cung cấp | Ví dụ | Chuyện gì xảy ra |
|---|---|---|
| Cả interval và prompt | /loop 5m check the deploy | Prompt của bạn chạy theo lịch cố định |
| Chỉ prompt | /loop check the deploy | Prompt chạy ở interval Claude tự chọn mỗi vòng |
| Chỉ interval, hoặc không gì | /loop | Prompt bảo trì dựng sẵn chạy, hoặc loop.md của bạn nếu có |
Đơn vị hỗ trợ: s, m, h, d. Giây được làm tròn lên phút gần nhất vì cron chỉ có độ hạt một phút. Interval không map về một bước cron gọn, ví dụ 7m hay 90m, bị làm tròn và Claude nói cho bạn biết nó chọn gì.
Khi bạn bỏ interval, Claude chọn động: sau mỗi vòng nó chọn một khoảng chờ từ một phút tới một giờ dựa trên thứ nó quan sát được — chờ ngắn khi build đang hoàn thành hoặc PR đang hoạt động, chờ dài khi không có gì đang chờ. Khoảng chờ đã chọn và lý do được in ra ở cuối mỗi vòng.
Khi bạn yêu cầu một lịch
/loopđộng, Claude có thể dùng thẳng toolMonitor. Monitor chạy một script nền và stream từng dòng output về, tránh hẳn việc polling — thường tiết kiệm token hơn và phản hồi nhanh hơn so với chạy lại một prompt theo interval.
Prompt bảo trì dựng sẵn chạy qua ba việc, theo thứ tự: tiếp tục việc chưa xong trong hội thoại; chăm PR của branch hiện tại (review comment, CI fail, merge conflict); rồi chạy các lượt dọn dẹp như quét bug hoặc đơn giản hoá khi không còn gì đang chờ. Claude không khởi xướng việc mới ngoài phạm vi đó, và các hành động không hoàn tác được như push hay xoá chỉ tiến hành khi chúng tiếp tục thứ transcript đã cho phép.
Thay prompt dựng sẵn bằng của bạn qua file loop.md:
| Đường dẫn | Phạm vi |
|---|---|
.claude/loop.md | Cấp project. Thắng khi cả hai file tồn tại |
~/.claude/loop.md | Cấp user |
Sửa loop.md có hiệu lực ở vòng kế tiếp, nên bạn tinh chỉnh chỉ dẫn trong lúc loop đang chạy. Nội dung quá 25.000 byte bị cắt.
Dừng một loop — bấm Esc trong lúc nó đang chờ vòng tiếp theo. Ở chế độ tự căn nhịp, Claude cũng tự kết thúc loop khi task xong.
Một chi tiết về skill: một lần kích hoạt theo lịch chỉ chạy các skill mà Claude được phép tự gọi. Những thứ sau tới tay Claude dưới dạng text thuần chứ không thực thi: built-in command như /permissions hay /clear; skill có disable-model-invocation: true (gồm cả bundled /verify); skill bị skillOverrides hoặc deny rule giữ lại; và MCP prompt.
Nhắc một lần
Không dùng /loop — mô tả bằng ngôn ngữ tự nhiên:
remind me at 3pm to push the release branch
in 45 minutes, check whether the integration tests passed
Ba đặc tính của scheduler cần biết
Jitter — để tránh mọi phiên đập vào API cùng một thời điểm, scheduler thêm một offset tất định vào thời gian kích hoạt. Task định kỳ kích hoạt muộn tới 30 phút so với giờ đã đặt (hoặc tới nửa interval, với task chạy dày hơn mỗi giờ). Task một lần đặt ở đầu hoặc giữa giờ kích hoạt sớm tới 90 giây. Offset suy từ task ID nên cùng một task luôn nhận cùng offset. Nếu thời điểm chính xác quan trọng, chọn một phút không phải :00 hay :30 — ví dụ 3 9 * * * thay vì 0 9 * * *.
Hết hạn sau bảy ngày — task định kỳ tự hết hạn 7 ngày sau khi tạo. Nó kích hoạt một lần cuối rồi tự xoá. Điều này chặn thời gian một loop bị bỏ quên chạy được.
Không bù các lần bị bỏ lỡ — nếu giờ của một task trôi qua trong lúc Claude đang bận với một request dài, nó kích hoạt một lần khi Claude rảnh, không phải một lần cho mỗi interval bị bỏ.
Mọi giờ được hiểu theo timezone cục bộ của bạn. Một task định kỳ dùng cron 5 trường: minute hour day-of-month month day-of-week. Cú pháp mở rộng như L, W, ?, và alias tên như MON không được hỗ trợ. Mỗi phiên giữ tối đa 50 task.
Tắt hẳn scheduler bằng CLAUDE_CODE_DISABLE_CRON=1.
Routines
Một routine là một cấu hình Claude Code đã lưu: một prompt, một hoặc nhiều repository, và một bộ connector — đóng gói một lần rồi chạy tự động trên hạ tầng cloud, nên nó vẫn làm việc khi laptop bạn đóng.
Ba loại trigger, và một routine kết hợp được nhiều loại:
- Scheduled — chạy theo nhịp định kỳ, hoặc một lần ở một thời điểm tương lai
- API — kích hoạt theo yêu cầu bằng HTTP POST tới một endpoint riêng của routine kèm bearer token
- GitHub — chạy tự động khi có sự kiện repository như pull request hoặc release
Tạo từ web ở claude.ai/code/routines, từ Desktop app, hoặc từ CLI bằng /schedule:
/schedule daily PR review at 9am
/schedule in 2 weeks, open a cleanup PR that removes the feature flag
Routine chạy tự chủ như phiên Claude Code cloud đầy đủ: không có bộ chọn permission mode và không có prompt duyệt nào trong lúc chạy. Thứ một routine với tới được quyết định bởi repository bạn chọn, network access và biến của environment, và các connector bạn đưa vào. Hãy giới hạn từng thứ đó về đúng mức routine cần.
Prompt là phần quan trọng nhất. Routine chạy tự chủ nên prompt phải tự chứa và tường minh về việc cần làm và thành công trông như thế nào.
Và đây là điểm bảo mật đáng đọc kỹ nhất về routine:
Trường
textbạn gửi kèm khi kích hoạt không tới routine như một tin nhắn trần. Nó tới bọc trong một block<routine-fire-payload>gắn nhãn là dữ liệu không tin cậy, kèm chỉ dẫn cho Claude không làm theo chỉ dẫn bên trong nó trừ khi prompt của chính routine nói vậy.Nghĩa là prompt đã lưu của routine phải chủ động opt-in vào việc hành động theo text đó — ví dụ viết “Investigate the alert described in the routine-fire-payload block” — nếu không routine coi text đó là ngữ cảnh trơ. Ai giữ bearer token cũng gửi
textđược, nên lớp bọc này làm text từ một token bị lộ tới nơi dưới dạng dữ liệu không tin cậy chứ không phải chỉ dẫn trực tiếp.
curl -X POST https://api.anthropic.com/v1/claude_code/routines/trig_.../fire \
-H "Authorization: Bearer sk-ant-oat01-xxxxx" \
-H "anthropic-beta: experimental-cc-routine-2026-04-01" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"text": "Sentry alert SEN-4521 fired in prod. Stack trace attached."}'
Token chỉ hiện một lần và không lấy lại được — lưu nó vào secret store ngay.
Ba điều đáng biết khác: routine thuộc tài khoản claude.ai cá nhân của bạn, không chia sẻ với đồng nghiệp, và mọi thứ nó làm qua GitHub identity hay connector của bạn đều hiện là bạn. Claude push việc của nó lên các branch có tiền tố claude/, luôn được nhận; push sang branch khác bị từ chối nếu branch được bảo vệ, có người khác đang mở PR từ branch đó, hoặc branch mang commit của người khác. Và:
Trạng thái xanh trong danh sách run chỉ nghĩa là phiên khởi động và thoát mà không có lỗi hạ tầng. Nó KHÔNG nghĩa là task trong prompt của bạn đã thành công. Mở run và đọc transcript để xác nhận Claude thực sự làm gì — request mạng bị chặn, thiếu tool của connector, và thất bại ở mức task đều lộ ra ở đó chứ không ở chỉ báo trạng thái.
/goal — làm tiếp tới khi điều kiện thoả
Lệnh /goal đặt một điều kiện hoàn thành, và Claude làm tiếp mà không cần bạn nhắc từng bước. Sau mỗi lượt, một model nhỏ và nhanh kiểm xem điều kiện có thoả chưa. Nếu model đánh giá là chưa, Claude bắt đầu một lượt nữa thay vì trả quyền điều khiển cho bạn.
Dùng goal cho công việc đáng kể có trạng thái kết thúc kiểm chứng được: migrate một module sang API mới tới khi mọi call site compile và test pass; hiện thực một design doc tới khi mọi acceptance criteria thoả; chia một file lớn thành các module tập trung tới khi mỗi cái dưới một ngưỡng kích thước; làm hết một backlog issue có nhãn tới khi hàng đợi rỗng.
So với hai cách khác giữ phiên chạy tiếp
| Cách | Lượt kế tiếp bắt đầu khi | Dừng khi |
|---|---|---|
/goal | Lượt trước kết thúc | Một model xác nhận điều kiện thoả, hoặc đánh giá là bất khả thi |
/loop | Một khoảng thời gian trôi qua | Bạn dừng nó, hoặc Claude quyết việc đã xong |
| Stop hook | Lượt trước kết thúc | Script hoặc prompt của chính bạn quyết |
/goal là shortcut ở phạm vi phiên: bạn gõ một điều kiện và nó hoạt động chỉ cho phiên hiện tại. Một Stop hook thì sống trong file settings, áp cho mọi phiên trong phạm vi của nó.
Auto mode tự nó duyệt tool call trong một lượt nhưng không bắt đầu lượt mới. /goal thêm một bộ đánh giá riêng kiểm điều kiện của bạn sau mọi lượt, nên việc hoàn thành do một model tươi mới quyết chứ không phải model đang làm việc. Hai thứ bổ sung cho nhau: auto mode bỏ prompt theo từng tool, /goal bỏ prompt theo từng lượt.
Dùng
/goal all tests in test/auth pass and the lint step is clean
Đặt một goal bắt đầu một lượt ngay lập tức, với chính điều kiện làm chỉ thị — bạn không cần gửi prompt riêng. Trong lúc goal hoạt động, chỉ báo ◎ /goal active hiện nó đã chạy bao lâu.
Goal không đổi permission mode của bạn. Muốn các lượt goal chạy không người trông thì chạy /goal trong auto mode; ở Manual mode Claude vẫn hỏi trước các tool call mà settings chưa cho phép.
Chạy /goal không tham số để xem trạng thái: điều kiện, thời gian đã chạy, số lượt đã được đánh giá, mức token đã tiêu, và lý do gần nhất của bộ đánh giá. /goal clear để xoá (alias: stop, off, reset, none, cancel).
Viết một điều kiện tốt
Đây là phần quyết định /goal có dùng được không:
Bộ đánh giá xét điều kiện của bạn dựa trên thứ Claude đã đưa ra trong hội thoại. Nó KHÔNG chạy lệnh và KHÔNG đọc file độc lập. Nên hãy viết điều kiện thành thứ mà output của chính Claude chứng minh được.
“All tests in
test/authpass” hiệu quả vì Claude chạy test và kết quả rơi vào transcript cho bộ đánh giá đọc.
Một điều kiện trụ được qua nhiều lượt thường có ba thành phần: một trạng thái kết thúc đo được (kết quả test, exit code của build, số file, một hàng đợi rỗng); một cách kiểm được nêu rõ (npm test exits 0, git status is clean); và các ràng buộc quan trọng (thứ không được đổi trên đường tới đó).
Điều kiện dài tối đa 4.000 ký tự. Muốn chặn thời gian goal chạy thì đưa một mệnh đề về số lượt hoặc thời gian vào chính điều kiện, ví dụ or stop after 20 turns.
Bộ đánh giá hoạt động thế nào
/goal là một lớp bọc quanh một prompt-based Stop hook ở phạm vi phiên. Mỗi khi Claude kết thúc một lượt, Claude Code gửi điều kiện và hội thoại tới small fast model đã cấu hình (mặc định là Haiku trên Claude API). Model trả về một trong ba phán quyết kèm lý do ngắn:
- Chưa thoả — Claude làm tiếp và lấy lý do đó làm định hướng cho lượt sau
- Đã thoả — Claude Code xoá goal và ghi một entry “achieved” vào transcript
- Bất khả thi — bộ đánh giá kết luận điều kiện không bao giờ thoả được. Claude Code xoá goal và ghi một entry “failed” kèm lý do; bạn không phải tự xoá
Nếu Claude cứ trả lời bộ đánh giá mà không có tiến triển — không dùng tool trong vài lượt liên tiếp — Claude Code dừng vòng lặp, in cảnh báo, và trả quyền điều khiển cho bạn với goal vẫn còn đặt. Việc đánh giá tiếp tục sau prompt kế tiếp của bạn.
Nếu một subagent hay một lệnh shell nền còn đang chạy lúc một lượt kết thúc, Claude Code bỏ qua việc đánh giá cho lượt đó và đánh giá khi lượt kế tiếp kết thúc.
Chạy /goal không tương tác
claude -p "/goal CHANGELOG.md has an entry for every PR merged this week"
Với output text mặc định, không gì được in ra tới khi lượt chạy kết thúc — nên một goal chạy nhiều lượt trông như bị treo. Thêm --output-format stream-json --verbose để phát từng tin nhắn trong lúc vòng lặp chạy.
Nguồn
- Run Claude Code programmatically
- Launch sessions from links
- Run prompts on a schedule
- Automate work with routines
- Keep Claude working toward a goal
Docs gốc cập nhật thường xuyên; khi có mâu thuẫn, tin bản tiếng Anh.