Nó làm gì
dispatch-ticket là chuỗi thao tác Thomas chạy mỗi lần một ticket đi từ “claim được” sang “đang
có Builder làm thật”: claim nó trên tracker, cắt branch và worktree, mở tab kèm pane trong Herdr,
in ra bản dispatch đã resolve, giao brief, rồi arm watcher trước khi đi tiếp. Chín bước, luôn theo
đúng thứ tự đó. Bước nào không ai kiểm là bước bị bỏ trong im lặng, và harness này chạy song song
vài chuỗi như vậy cùng lúc, nên im lặng ở đây nghĩa là một Builder ngồi không trong một pane không
ai nhìn.
Điểm khác của nó nằm ở chỗ đặt ranh giới: claim xảy ra trước khi worktree tồn tại. Ticket được
gán trên tracker trước, nên hai session Thomas cùng nhặt trên frontier sẽ thấy claim của nhau thay vì
đua nhau tạo cùng một branch. Vấn đề sinh ra luật này là hai session dùng chung một checkout và mất
commit trong im lặng vì một lệnh git switch chạy song song. Mỗi session một worktree là cách chữa,
và sự cô lập đó phủ mọi lệnh có ghi xuống đĩa, không riêng git.
Khi nào Thomas gọi nó
| Tình huống trước mặt bạn | Gọi cái nào |
|---|---|
| Một ticket trên frontier, ô assignee còn trống | dispatch-ticket (claim trước, worktree sau) |
| Chính cú dispatch, sau khi đã claim | dispatch-ticket cộng skill đi kèm theo runtime (dispatch-ticket-claude, -codex, -opencode) |
| Shaper, QA hay Rin cần pane chứ không chỉ Builder | Vẫn skill đó, vẫn cơ chế đó; chỉ khác tiền tố nhãn tab và pane |
| Một pane đứng im hoặc kẹt giữa lượt | WATCHING.md (tài liệu đi kèm, không phải skill riêng) |
| Builder đã handback, tới lúc gỡ worktree | CLEANUP.md (tài liệu đi kèm) |
Cần sẵn gì
- Watchdog của workspace đang chạy cho project này. Dispatch mà không có watchdog là dừng hẳn,
không phải cảnh báo (
exit 1, không phảiecho). - Payload harness đã được commit, không phải chỉ được allow-list qua mặt
.gitignore. Worktree chỉ chứa nội dung đã tracked, nên một file.agents/roles/builder.mdcòn untracked nghĩa là Builder khởi động mà không có hợp đồng nào. .agents/orchestrator.mdcó một dòng thật (runtime, model, effort) cho vai sắp dispatch. Một dòng ghi<set-me>nghĩa là chưa quyết, và chưa quyết là dừng ngay tại lúc dispatch.- Đọc hợp đồng của vai sắp dispatch trước (
builder.mdcho một Builder), vì skill này chỉ mang phần cơ chế, không nói vai đó phải làm gì với cơ chế ấy.
Nó để lại gì
| Kết quả | Nơi nó nằm lại |
|---|---|
| Cú claim | Ô assignee trên tracker: builder/<ticket-id> |
| Chính bản dispatch | .astraler/state/dispatch-record.json, khoá theo ticket id: branch, worktree, workspace, tab, pane, runtime, write-set |
| Worktree và branch | <repo-root>/.claude/worktrees/<branch-slug>, đã gitignore, gỡ lúc cleanup |
| Bản brief | Gửi đi ở dòng đầu như một slash command, có tiền tố plugin (/mattpocock-skills:implement <ticket>) |
| Phần việc của chính Builder | Commit trên branch của ticket, push trước khi handback |
Lỗi đã biết
Lấy từ harness/.agents/memory/recurring-failure-modes.md. Mọi mục dưới đây đều đang ở trạng
thái promoted: đã sửa và đã nằm trong hợp đồng mà trang này mô tả.
- AST-016 / AST-027: hai session root dùng chung một checkout, mất commit trong im lặng vì
một
git switchchạy song song. Đã sửa: mỗi session một worktree, không ngoại lệ. - AST-036: harness được allow-list nhưng chưa commit thì vô hình bên trong mọi worktree của Builder. Đã sửa: kiểm tra commit trước cú dispatch đầu tiên.
- AST-032 / AST-037: một brief nhiều dòng dán vào composer mà không submit, và pane báo
idletrong lúc nó nằm đó chưa gửi. Đã sửa: bấm Enter tường minh sau khi dán, cộng thêm bắt watcher phải thấy trạng tháiworkingrồi mới tin là lượt đã bắt đầu. - AST-097:
TERMINAL:donenghĩa là lượt đã kết thúc, không phải việc đã xong; một Builder đang đỗ ở background đọc ra thành done. Đã sửa: kiểm tiến trình OS và dòng status của runtime trước khi kết luận là xong. - AST-124: watcher theo lượt chỉ phủ một lượt rồi thoát; không có gì arm lại, và cú arm lại chính là bước hay bị bỏ ngay sau một tác vụ dài. Đã sửa: mỗi lượt mới có watcher mới.
- AST-092: một Builder dừng trước khi commit để lại phần việc chỉ tồn tại trên đĩa;
git worktree removexoá nó không nói gì. Đã sửa: “commit, push, rồi mới trả về” là ba hành động tách bạch.
Đang chạy đúng nếu
- Watchdog được xác nhận đang chạy trước cú dispatch đầu tiên của session, không phải mặc định là có.
.astraler/state/dispatch-record.jsoncó một entry cho mọi ticket đang sống, kèm write-set.- Mọi brief đã gửi đều có watcher arm ngay trong cùng hành động đó, không phải một bước riêng làm sau.
- Nhãn tab và nhãn pane khớp với vai đã dispatch (
builder:<id>so vớispec:<id>,qa:<id>,rin:<id>), vì tiền tố sai thì watchdog không nhìn thấy. - Cleanup chỉ gỡ worktree sau khi
git status --shorttrống vàcheck-simplify-markers.shxanh.
Nó nằm ở đâu trong chuỗi
Câu truy vấn frontier (nằm trong thomas.md) quyết định ticket nào tới lượt → dispatch-ticket
claim nó và đặt một vai builder vào pane → Builder chạy vòng khép kín của riêng nó
(implement → review → simplify → /skills/codex-arm) rồi handback → CLEANUP.md của
dispatch-ticket thu hồi worktree sau khi artifact đã được kiểm → cửa milestone đi qua
/skills/review-with-rin trước khi merge. thomas và builder là hai hợp đồng vai mà skill
này nằm ở giữa.