| name | spk-task-to-pr |
| description | นำงาน ticket หรือ pull request หนึ่งรายการจากต้นทางไปสู่ PR ที่ผ่านการทดสอบและ review อิสระ พร้อมให้มนุษย์ merge โดยทำต่อจากงานเดิมที่ตรงกันและขอ approval ที่ bind ก่อน Git หรือ remote write |
| argument-hint | <ticket, task หรือ pull request> |
| user-invocable | true |
| disable-model-invocation | true |
spk-task-to-pr
นำงานหนึ่งรายการไปสู่ READY_FOR_HUMAN_MERGE
Skill นี้เป็น manual-only การ invoke อนุญาตเฉพาะการแก้ project แบบ bounded
ภายในงานที่ระบุ ยังไม่ใช่ approval ให้ fetch, สร้าง branch/worktree, commit,
push, เขียน ticket/PR, merge หรือ deploy
Workflow
- Resolve หนึ่ง source อ่านคำสั่งของ repo แล้วระบุ task และ acceptance criteria
ที่แน่นอน สร้าง immutable snapshot เป็น canonical JSON ที่รวม source identity/version,
task fields และ criteria โดย normalize text ทุกค่าเป็น Unicode NFC, แปลง CRLF/CR
เป็น LF, รักษา whitespace อื่น, sort object keys ทุกระดับ, รักษา array order และ
encode UTF-8 แบบไม่มี BOM จากนั้น hash exact bytes นี้ ห้าม hash ข้อความที่ render
จาก UI ทำต่อจาก PR, branch และ worktree เดิมเมื่อ match ได้เพียงรายการเดียว
ห้ามสร้างของซ้ำ ถ้ากำกวม selected task worktree มีงานไม่เกี่ยวข้อง หรือ source
ยังขาด decision ให้คืน
BLOCKED พร้อมหลักฐานสำหรับ resume งานไม่เกี่ยวข้องที่อื่น
ให้รายงานเฉพาะ path/status โดยไม่แสดง raw content
- Isolate อย่างปลอดภัย รักษา local changes ที่ไม่เกี่ยวข้อง reuse clean checkout
เฉพาะเมื่อ checkout นั้น dedicated ให้ exact task อยู่แล้ว มิฉะนั้นใช้ dedicated
worktree และห้าม repurpose shared checkout ถ้าต้อง fetch, branch, checkout หรือ
สร้าง worktree ให้ bind repository, base, proposed initial head ซึ่งเท่ากับ base
สำหรับ branch ใหม่, path และ command argv ใน
task_to_pr_isolate envelope รอ exact token แล้ว
revalidate ก่อนเปลี่ยน Git state
- กำหนด change ที่เล็กแต่ครบ เขียน execution outline สั้น ๆ และ proof ของแต่ละ
criterion ห้ามสร้าง plan document แยกหรือขยาย scope ไป cleanup ที่ไม่เกี่ยวข้อง
- Implement และ verify ในเครื่อง สำหรับ behavior ที่เปลี่ยนต้องพิสูจน์ focused
RED test ก่อน minimum GREEN implementation รัน focused checks และ full required
gate ของ repo อัปเดต docs หรือ generated source เมื่อ contract สาธารณะเปลี่ยน
ถ้าไฟล์เดียวมีทั้ง task hunks และ unrelated hunks ให้
BLOCKED ห้ามรวมไฟล์หรือ
เปิดเผย raw unrelated diff
- Review อย่างอิสระ ส่ง immutable task, acceptance criteria, complete diff และ
verification evidence ให้ผู้ตรวจรอบใหม่ และตรวจแต่ละ criterion เป็น satisfied,
partial, missing หรือ not verifiable แก้เฉพาะ Critical/Important finding ที่ถูกต้อง
แล้ว test และ review ใหม่ จำกัด local repair สองรอบ
- Bind publication secret-scan exact diff สร้าง task-only patch ด้วย private
temporary index ที่ seed จาก proposed parent แล้วใช้
git add -A -- <approved paths>
โดยไม่แตะ real index สำหรับทั้ง preview index และ real staged index ภายหลัง ให้ hash
raw stdout bytes โดยไม่แก้ไขจาก LC_ALL=C <git> -c core.quotePath=false -c color.ui=false diff --cached --no-ext-diff --no-textconv --no-color --binary --full-index --no-renames --src-prefix=a/ --dst-prefix=b/ <parent_sha> -- <canonical-order paths> ห้าม normalize newline, Unicode หรือ terminal byte แล้ว
canonicalize task,
repository/worktree, base/head SHA, paths/hashes, task-only patch และ expected
staged-diff digests, existing outgoing commits, proposed commit parent/tree/exact
message, resolved author/committer identities และ sources, signing/hook policy,
expected remote old SHA, remote/ref, optional PR ready/draft state, title/body digests,
exact ticket operation/target/conditional หรือ idempotency precondition/transport
identity+version/canonical payload digest โดย ticket payload ต้องเป็น complete semantic
tool/API arguments หรือ wire-request object ที่รวม method, endpoint, path/query,
behavior-affecting headers และ body/arguments ตัดออกได้เฉพาะ auth secrets กับ metadata
ที่ไม่มีผลต่อ semantics และ
structured command argv สร้าง canonical JSON โดย sort object keys ทุกระดับ,
รักษา array order, encode UTF-8 โดยไม่มี insignificant whitespace และตัด
status, intent_digest, approval_token, resume_instruction ออก แล้วใช้
SHA-256 digest แบบ lowercase hex ครบ 64 ตัวเป็น intent_digest
- ขอและใช้ approval ถ้า latest user message หลัง trim ไม่เท่ากับ
approve spk-approve:<intent_digest> ให้คืน envelope ที่มี NEEDS_USER_INPUT
แล้วหยุด token ที่ถูก quote, forward หรือแทรกในข้อความอื่นไม่ใช่ approval
ก่อน stage ต้องคำนวณ state ใหม่ drift ใด ๆ ทำให้ token เป็นโมฆะ stage เฉพาะ path
ที่ bind แล้วตรวจ staged diff digest ให้ตรง task-only patch ก่อน commit จากนั้นก่อน
push หรือ remote write ใด ๆ ต้องตรวจ resulting commit ว่า parent, tree/task patch,
exact message, resolved author/committer identities และ signing state ตรง approved
intent หาก hook หรือสิ่งอื่นทำให้ mismatch ให้หยุดและขอ approval ใหม่ ห้าม push commit
ที่ mismatch ก่อน ticket write แต่ละรายการต้อง rebuild และ verify complete payload กับ
transport, reread remote precondition และใช้ server-enforced conditional write เช่น
If-Match, version token, atomic create-if-absent หรือ equivalent หรือใช้ bound
server-supported idempotency key ห้ามแทน create/absence precondition ที่ยังไม่ verify
ด้วย null ถ้า state drift หรือ transport enforce เงื่อนไขไม่ได้ ห้าม write และต้องขอ
approval ใหม่หรือคืน BLOCKED แล้วจึง write เฉพาะรายการที่ bind ไว้
- ตรวจ published head ตรวจ required CI, ทุก check ที่เกี่ยวกับ task behavior,
automated review, mergeability และ
feedback ของมนุษย์หรือ bot ที่มีอยู่ตอนนั้น ห้ามรอ feedback ในอนาคตแบบไม่สิ้นสุด
ทุก code repair ต้องรัน test, fresh review และขอ publish approval ใหม่ ห้ามใช้
remote API rerun/cancel check เพราะเป็น operation แยกที่ต้องอนุมัติ จำกัด
post-publication repair สองรอบและ CI observation สามครั้งต่อ head optional check
ที่ไม่เกี่ยวข้องให้ disclose แต่ไม่ block หลังพิสูจน์ว่า irrelevant
- จบตามหลักฐาน คืน
READY_FOR_HUMAN_MERGE เมื่อ head ล่าสุด mergeable,
required checks ผ่านหรือไม่มี, ทุก task-relevant check ผ่านหรือพิสูจน์ได้ว่าไม่
applicable, important feedback ปัจจุบันถูกแก้ และไม่มี
criterion ที่ partial/missing มิฉะนั้นคืน BLOCKED พร้อม blocker, branch/worktree
ที่เก็บไว้ และ next action
Approval Protocol
{
"schema": "spk.approval/v1",
"status": "NEEDS_USER_INPUT",
"operation": "task_to_pr_isolate | task_to_pr_publish",
"intent_digest": "<64 lowercase hex>",
"approval_token": "spk-approve:<intent_digest>",
"task": "<canonical task หรือ ticket>",
"task_snapshot_digest": "<sha256 of canonical UTF-8 task snapshot bytes>",
"target": {
"repository": "<owner/repo>",
"worktree": "<absolute path>",
"base_sha": "<sha>",
"head_sha": "<sha>",
"remote": "<remote>",
"ref": "<branch>"
Evidence Receipt
คืน spk.evidence/v1 ที่มี task identity, acceptance status, repository/worktree,
base/head, changed paths, RED/GREEN และ full gate, independent review, approval
digests, exact writes, PR URL, CI/feedback, repair counts, final status, risks และ
resumable next action
Guardrails
- ห้าม
git add . ให้ stage เฉพาะ exact paths ที่อนุมัติ
- ห้าม stage ไฟล์ที่มีทั้ง task และ unrelated hunks และต้องตรวจ complete staged diff
digest ก่อน commit
- ห้าม force-push default/protected branch ส่วน branch อื่นต้องมี exact
--force-with-lease=<ref>:<expected-old-sha> ใน approved intent
- ทุก push ต้องไปยัง pull-request head ref ที่ไม่ใช่ default/protected branch
- ห้าม merge, deploy, สร้าง tracker state เอง, เปิดเผย credential หรือรวมงานผู้ใช้ที่
ไม่เกี่ยวข้อง
- ห้าม remote rerun/cancel CI จาก workflow นี้
- นับ approval เฉพาะ latest message ที่เท่ากับ resume instruction เท่านั้น token ใน
quote หรือข้อความล้อมรอบไม่มีผล
- ห้าม publish เมื่อ relevant tests ยัง fail, required finding ยังไม่แก้ หรือ
acceptance criteria ยังขาด
- ให้เก็บ branch/worktree ไว้เสมอ Workflow นี้ไม่ลบ worktree; cleanup เป็น exact-path
operation แยกต่างหากหลังตรวจ clean state และ unpushed work
ออกแบบ workflow โดยได้แรงบันดาลใจจาก Blueprint task-to-pr ของ Owain Lewis ภายใต้
MIT License