Goal loop until acceptance criteria pass, level 4 — /ship-loop <mục tiêu>. Turns the goal into criteria each with a check command, then iterates implement → check → fix under Claude Code /goal with iteration/time/stuck caps; evidence in LOOP.md; optional release via one Ship question. Owner-only.
Install
npx skillscat add 8-sync-dev/8sync/ship-loop Install via the SkillsCat registry.
Mục tiêu: $ARGUMENTS
Level 4. Mặc định --max-iter 12, --max-min 90. Chỉ owner khởi động. "dừng"/"stop" của owner kết thúc ngay.
A. Chuẩn bị (một lượt)
/planning— viếtsu-code/ship/<slug>/PLAN.md; mỗi acceptance criterion phải có MỘT lệnh kiểm được (exit 0 = pass), nhẹ, chạy local được (nice -n 19 ionice -c3,-j2) hoặc tên workflow CI. Criterion không có lệnh → viết lại hoặc bỏ. Hỏi (nếu cần) bằng MỘTAskUserQuestion; owner nói "tự làm đi" → chọn Recommended, ghi giả định.- Tạo
su-code/ship/<slug>/LOOP.md(bảng criterion → lệnh; mục Evidence) và ghi<slug>vàosu-code/ship/ACTIVE.TaskCreateMỘT task "Loop : lặp tới khi tick in stop" và giữin_progresstới bước D (để stop gate của kit giữ vòng lặp).
2b. Sprint planning (/sprint <slug>, đọcsprint/SKILL.md):8sync ccc . goal "<mục tiêu>" --files <file>để phòng khác thấy;8sync ccc standup <slug> init --roles …theo cổng quy mô của skill (rd · plan · dev · review · qa · quick · critic; mục tiêu nhỏ thì không mở sprint), giao theo đợt. Lead điều phối và nối phần, không tự làm mọi thứ. 8sync ccc loop init <slug> --max-iter <N> --max-min <M>(verbloop:init,tick --changed <n> --digest "<digest>"→ incontinue(kèmiter/max · phút/max) hoặcstop:<reason>với reason ∈max-iter|max-min|stuck(digest lặp 2 lần; digest rỗng thì bỏ qua rule này) |no-change(không file nào đổi);status [--json];done [--reason];ls). Digest = content hash của trạng thái làm việc:git diff | sha256sum | cut -c1-16ghép với dòng output cuối của check đầu tiên đang fail (cùng file sửa hai lần với nội dung khác nhau KHÔNG bị coi là stuck). Mọi output củatickkháccontinue …(lỗi, loop không tồn tại, corrupt) đều nghĩa là DỪNG. Sau /compact hoặc resume: chạy8sync ccc loop status <slug>trước tiên. Push nhánh feature để chạy CI được phép trước câu hỏi Ship (guard chỉ chặn merge/push main/tag/release/publish/deploy). Verb chưa có trong binary (bản cũ) → ghi "not verified: loop verb thiếu", tự đếm iteration/thời gian trong LOOP.md.- Tự tiếp khi lượt kết thúc — ngay sau
loop init:CronCreatecron*/5 * * * *,recurring: true, prompt/ship-tick <slug>(skillship-tickmodel-invocable, chạy khi session rảnh: standup → criterion đỏ → R&D khi kẹt → sửa →loop ev→tick). Vòng lặp vì thế sống qua lượt kết thúc, /compact và lúc chờ CI (gh run watchnền) mà owner không phải gõ lại; mỗi tick ≤ một việc;stop:<reason>/xanh hết → ship-tick tự đóng vàCronDeletejob đó. Cron chỉ chạy khi session mở, hết hạn sau 7 ngày.
B. Vòng lặp: nội tại là chính, /goal là lớp gia cố tuỳ chọn
Chính (không cần owner làm gì): Claude tự lặp mục C trong cùng lượt — sau mỗi iteration đọc lại LOOP.md, chạy tick, và chỉ kết thúc lượt khi tick in stop:<reason> hoặc mọi criterion xanh (mục D). Stop gate của kit chặn việc dừng lặng khi task list còn mở, nên KHÔNG kết thúc lượt giữa chừng để "hỏi tiếp không". Mỗi iteration ≤ 1 lần block Stop (Claude Code cap 8 lần liên tiếp — https://code.claude.com/docs/en/hooks-guide), vì vậy vòng lặp đi bằng chính thân skill, không dựa vào hook.
Gia cố (tuỳ chọn, owner-run): /goal là lệnh built-in của Claude Code mà Claude không tự gõ được. Khi owner muốn evaluator độc lập kiểm sau mỗi lượt, in đúng dòng dưới (đã thay <…>) trong một code block để owner dán; chạy headless: claude -p "/goal …" --permission-mode auto --max-turns <N>. Cú pháp theo https://code.claude.com/docs/en/goal: /goal <condition> (≤ 4,000 ký tự; evaluator là model nhỏ, KHÔNG chạy tool, chỉ đọc transcript; goal tự xoá khi met / impossible / lỗi phải sửa; /goal clear bỏ goal; goal không đổi permission mode — chạy trong auto mode). Cần hooks bật và workspace đã trust.
/goal Mục tiêu "<mục tiêu>" xong khi: (1) với MỖI criterion trong su-code/ship/<slug>/PLAN.md, lệnh kiểm của nó đã chạy trong lượt gần nhất và exit code 0, output hiện trong transcript; (2) mỗi lần chạy đã được ghi một dòng (iteration, lệnh, exit code, 1 dòng output) vào su-code/ship/<slug>/LOOP.md; (3) lần `8sync ccc loop tick` gần nhất in "continue" hoặc `8sync ccc loop done` đã chạy exit 0. Hoặc dừng nếu `8sync ccc loop tick` in "stop:<reason>" — khi đó ghi brief vào LOOP.md rồi kết thúc, không làm tiếp. Không sửa file test chỉ để cho pass. Hoặc dừng sau <N> turn.Điều kiện phải chứng minh được từ output hiện trong transcript — nên mỗi iteration phải in nguyên văn kết quả lệnh check và dòng tick.
C. Mỗi iteration (bắt đầu ngay sau khi đặt goal; goal gọi lượt kế)
- Standup —
8sync ccc standup <slug>: exit 3 = có role ngồi không → giao item thật (criterion đỏ chodev, test đỏ choqa, review diff vừa xong choreview, đọc trước criterion kế chord) hoặcrest <lý do>, chạy lại tối đa một lần; xemPhòng khác:+⚠ trùng file→SendMessagetrước khi sửa file trùng. - Implement phần nhỏ nhất tiến tới criterion đỏ qua role (đọc file trước khi sửa;
task/quick-task/qasong song khi file tách bạch, ≤4 writer; watchdog áp lực → không thêm agent). Code mới có test; không sửa test cho pass. - Check — chạy lệnh của TẤT CẢ criterion (nhẹ, local) hoặc workflow CI (
gh workflow run … --ref <branch>→gh run watch <id> --exit-statusnền). Build/test nặng chỉ trên CI. - Evidence — chạy mỗi check bằng
8sync ccc loop ev <slug> <C#> -- '<lệnh>': nó chạy lệnh, in 15 dòng cuối và tự appenditer <k> | <C#> | exit <n> | <dòng cuối>vào LOOP.md. KHÔNG tự viết hàm bọc kiểur(){ bash -c "$2" …}: guard không đọc được lệnh trong biến nên auto mode sẽ từ chối. Không có dòng evidence → criterion không tính là pass. - Tick — nếu MỌI criterion đã xanh ở bước 2 (có evidence) → sang D "tất cả xanh" ngay, KHÔNG tick (tránh
stop:max-iterở vòng cuối). Còn criterion đỏ →8sync ccc loop tick --changed <số file đổi> --digest "<sha256 diff + dòng cuối output check fail đầu tiên>". Incontinue→ iteration kế. Instop:<reason>→ bước D. - Stuck cũng tính khi hai iteration liền cùng digest (content hash, không phải tên tool) hoặc không file nào đổi (DESIGN:
su-code/ship/auto-harness/DESIGN.md). Hết lượt mà goal chưa met, evaluator đẩy lý do làm hướng dẫn cho lượt sau.
D. Kết thúc
- stop: (cap/time/stuck) hoặc owner "dừng": ghi brief ≤10 dòng vào LOOP.md (criterion nào xanh/đỏ + bằng chứng, đã thử gì, đề xuất tiếp),
8sync ccc loop done, xoá dòng khỏiACTIVE,CronList→CronDeletejob/ship-tick <slug>,/goal clearnếu goal còn, báo owner. Owner "huỷ hết" →8sync ccc cancel(goal + urgent + loop trong ACTIVE, fail-closed;--allthêm mọi loop + idle/delegate off). Không làm thêm. - Retro (cả hai nhánh dưới): keep/drop/try ≤3 dòng →
/remember;8sync ccc . goal clear. - Tất cả xanh: sprint review (
reviewer+qaUAT +verifier, chạy song song) →8sync ccc risk(gate bắt buộc từ tên file đổi) →/sectrên diff (+/rules//aup-auditkhi risk liệt kê) → CHANGELOG Unreleased +/rememberbài học → commit conventional (không push). Có--releaseở cuối$ARGUMENTS: làm như/ship-autotừ bước 3 — MỘTAskUserQuestionheaderShip(options đúng:Duyệt tất cả (Recommended)·Chỉ merge, chưa deploy·Dừng) → PR →gh pr checks --watchnền (CI phải xanh trên cả Windows, macOS và Linux (test + build release) trước merge/tag; OS nào chưa có job → ghi "not verified: " và không merge) → merge → tag/release →8sync up/kit refresh nếu có → monitor tới xanh. Không có--release→ dừng sau commit.
Rails: không bypassPermissions; không in secret; guard chặn destructive/force-push. Mọi câu "xong/pass" phải kèm lệnh + output; thiếu → "not verified". Báo cáo cuối: criterion + evidence, iteration/thời gian đã dùng, việc còn dở.