ชีตสรุป harness ของ agent: องค์ประกอบ ไฟล์ ปัญหา และเช็กลิสต์เริ่มต้น
Harness ของ agent ประกอบด้วยระบบย่อยห้าอย่าง ได้แก่ คำสั่ง เครื่องมือ สภาพแวดล้อม สถานะ และวงป้อนกลับ ชุดไฟล์ขั้นต่ำประกอบด้วย AGENTS.md ฉบับย่อที่เป็นตัวกำหนดเส้นทาง สคริปต์ตรวจสอบ (make check, verify.sh) ไฟล์ความคืบหน้า และรายการฟีเจอร์พร้อมสถานะ สถานะความพร้อมถูกตั้งโดยสคริปต์ ไม่ใช่โดย agent
ห้าระบบย่อยของ harness
| ระบบย่อย | คืออะไร | สิ่งประดิษฐ์ | อาการเมื่อพัง |
|---|---|---|---|
| คำสั่ง | agent ต้องรู้อะไรเกี่ยวกับโปรเจกต์ | AGENTS.md / CLAUDE.md, skills, docs/, ADR | ฝ่าฝืนแบบแผนที่รู้กันอยู่แล้ว |
| เครื่องมือ | agent ทำอะไรได้บ้าง | shell, เทสต์, linter, เบราว์เซอร์, MCP server | «อยากทำแต่ทำไม่ได้» |
| สภาพแวดล้อม | agent ทำงานที่ไหน | ไฟล์ล็อก, Docker/devcontainer, git worktree, sandbox, init.sh | เซสชันเริ่มด้วยการซ่อมสภาพแวดล้อม |
| สถานะ | อะไรคงอยู่ข้ามการรีสตาร์ต | PROGRESS.md, DECISIONS.md, feature_list.json, commit | เซสชันใหม่ไม่รู้ว่าค้างอยู่ที่ไหน |
| วงป้อนกลับ | agent รู้ว่าตัวเองผิดได้อย่างไร | make check, E2E, hooks, arch-check, ผู้ประเมิน | «เสร็จแล้ว» แต่ใช้งานไม่ได้ |
ลำดับการนำไปใช้ตั้งแต่ต้น: วงป้อนกลับ → คำสั่ง → สถานะ → สภาพแวดล้อม → เครื่องมือ
ไฟล์ของ harness
| ไฟล์ | วัตถุประสงค์ | กฎ |
|---|---|---|
| AGENTS.md / CLAUDE.md | จุดเริ่มต้น: โปรเจกต์คืออะไร เปิดอย่างไร ตรวจสอบอย่างไร | ตัวกำหนดเส้นทางสั้น (ประมาณ 80 บรรทัด) ลิงก์ไปเอกสารพร้อมเงื่อนไข «อ่านเมื่อไร» |
| docs/*.md | รายละเอียดแยกตามหัวข้อ | อ่านเมื่อจำเป็น ไม่อ่านทั้งหมด |
| .claude/skills/*/SKILL.md | ขั้นตอนที่ทำซ้ำ (deploy, review) | โหลดเมื่องานตรงกับคำอธิบาย |
| PROGRESS.md | สถานะ สิ่งที่ทำ ปัญหาขวางทาง ขั้นตอนถัดไป | อัปเดตเมื่อจบทุกเซสชัน |
| DECISIONS.md | การตัดสินใจ เหตุผล ตัวเลือกที่ถูกปฏิเสธ | บันทึกเส้นทาง ไม่ใช่แค่ข้อสรุป |
| feature_list.json | ฟีเจอร์: behavior, verification, state | active เพียงหนึ่งรายการ (WIP=1) |
| scripts/verify.sh | ตรวจสอบฟีเจอร์และเปลี่ยนเป็น passing | เป็นตัวเดียวที่ตั้ง passing พร้อม SHA ของ commit |
| scripts/arch-check.sh | ขอบเขตสถาปัตยกรรม | รหัสออก 1 + WHY และ FIX ในผลลัพธ์ |
| scripts/init.sh | ตรวจสภาพแวดล้อมก่อนเริ่มงาน | สภาพแวดล้อม git สะอาด make check เขียว ฟีเจอร์ active |
| sprint contract | ข้อตกลงสำหรับฟีเจอร์ก่อนเขียนโค้ด | ในขอบเขต / นอกขอบเขต / คำถามที่ยังเปิดอยู่ |
| .claude/settings.json | สิทธิ์และ hooks ของ Claude Code | การตรวจสอบผูกกับเหตุการณ์ ไม่อยู่ในความจำของ agent |
โครงร่าง AGENTS.md
# โปรเจกต์: backend การชำระเงิน (FastAPI, PostgreSQL)
## เริ่มต้น
docker compose up -d && ./scripts/init.sh
## การตรวจสอบ
make check # lint, ชนิดข้อมูล, unit, arch-check
make e2e # สถานการณ์ปลายทางถึงปลายทาง
## Definition of Done
- make check และ make e2e — รหัส 0
- ฟีเจอร์ถูกตั้งเป็น passing โดย scripts/verify.sh
- อัปเดต PROGRESS.md แล้ว
## MUST
- คิวรี DB ผ่าน repository เท่านั้น
- ความลับมาจากตัวแปรสภาพแวดล้อมเท่านั้น
## เอกสาร
- docs/payments.md — เมื่องานเกี่ยวกับการชำระเงินและการคืนเงิน
- docs/migrations.md — เมื่อมีการเปลี่ยน schema ของ DB
สถานะของฟีเจอร์
| สถานะ | ความหมาย | ใครเปลี่ยน |
|---|---|---|
| pending | รอคิว | ผู้วางแผน |
| active | กำลังทำ (มีได้เพียงหนึ่ง) | agent เมื่อเริ่ม |
| passing | ผ่านการตรวจสอบ | เฉพาะ verify.sh |
| blocked | ต้องการการตัดสินใจจากคน | agent พร้อมเหตุผล |
ระดับการตรวจสอบ
| ระดับ | เนื้อหา | เมื่อไร |
|---|---|---|
| 1 | Lint, ชนิดข้อมูล | ทุกครั้ง |
| 2 | Unit และ integration tests | ทุกครั้ง |
| 3 | E2E | การเปลี่ยนแปลงกระทบมากกว่าหนึ่งชั้น และก่อนพูดว่า «เสร็จ» |
| 4 | arch-check | มีการ import ข้ามชั้นใหม่ |
สิทธิ์ในการพูดว่า «เสร็จ» มีได้หลังจากระดับสูงสุดเท่านั้น ยูนิตเทสต์ที่เขียวไม่ได้หมายถึงความพร้อม
การทำให้กฎบังคับใช้ได้
| ระดับ | เครื่องมือ | ต้นทุน |
|---|---|---|
| Guard แบบ grep | สคริปต์ค้นหารูปแบบและพิมพ์ข้อความ WHY/FIX | ไม่กี่นาที |
| กฎ linter | import-linter (Python), dependency-cruiser, eslint-plugin-boundaries (JS/TS) | หนึ่งชั่วโมง |
| เทสต์สถาปัตยกรรม | เทสต์ใน CI ที่ล้มเมื่อละเมิดชั้น | มากกว่า แต่มองเห็นได้ใน make check |
#!/usr/bin/env bash
fail=0
if grep -rn "from app.db" app/services/; then
echo "WHY: service ไม่เข้าถึง DB โดยตรง"
echo "FIX: ใช้ repository จาก app/repositories/"
fail=1
fi
exit $fail
ปัญหาที่พบบ่อยและวิธีแก้
| ปัญหา | ระบบย่อย | วิธีแก้ |
|---|---|---|
| กฎใน CLAUDE.md ไม่ถูกปฏิบัติตาม | คำสั่ง | ย่อไฟล์ เปลี่ยนกฎเป็นการตรวจสอบหรือ hook |
| agent รันเทสต์ไม่ได้ | เครื่องมือ | อนุญาตคำสั่ง ติดตั้ง dependencies ในอิมเมจ |
| พฤติกรรมต่างกันในแต่ละเครื่อง | สภาพแวดล้อม | ไฟล์ล็อก Docker/devcontainer เวอร์ชัน runtime ที่ตรึงไว้ |
| ความจำเสื่อมระหว่างเซสชัน | สถานะ | PROGRESS.md บันทึกการส่งต่อเซสชัน อ่านตอนเริ่ม |
| เริ่มสามฟีเจอร์ ไม่มีอันไหนเสร็จ | สถานะ | WIP=1 ใน feature_list.json |
| «เสร็จ» แต่ใช้งานไม่ได้ | วงป้อนกลับ | DoD, E2E, verify.sh, ผู้ประเมินอิสระ |
| เทสต์เขียวแต่ฟีเจอร์พัง | วงป้อนกลับ | E2E ด้วยฐานข้อมูลและการตั้งค่าจริง |
| agent คัดลอกรูปแบบที่ไม่ดี | วงป้อนกลับ | arch-check ตั้งแต่ต้น |
| ไม่รู้ว่า agent ทำอะไรไปบ้าง | สถานะ | commit เล็ก รายงานใน PROGRESS.md, DECISIONS.md |
| agent ทำสภาพแวดล้อมพังข้ามคืน | สภาพแวดล้อม | sandbox, git worktree, จุดตรวจ, ย้อนกลับผ่าน init.sh |
| ความคิดเห็นเดิมปรากฏในรีวิวสองครั้ง | harness โดยรวม | เปลี่ยนเป็นการตรวจสอบใน make check และตัดข้อความออกจากคำสั่ง |
บทบาทสำหรับงานที่ยาว
| บทบาท | ทำ | ไม่ทำ |
|---|---|---|
| ผู้วางแผน | ฟีเจอร์พร้อมเกณฑ์การยอมรับ | ไม่เขียนโค้ด |
| ผู้สร้างโค้ด | ลงมือทำหนึ่งฟีเจอร์ รันเทสต์ | ไม่ตัดสินว่าเสร็จหรือยัง |
| ผู้ประเมิน | ตัดสินตาม rubric พร้อมอ้างอิงไฟล์ บรรทัด log | ไม่เห็นเหตุผลของผู้สร้างโค้ด |
| การรวมโค้ด | commit เมื่อ review == pass | เป็นโค้ด ไม่ใช่ agent |
งบประมาณสำหรับการทำงานอัตโนมัติ
- เป้าหมาย — หนึ่งประโยค (เช่น ทำให้ทุกฟีเจอร์เป็น passing)
- WIP=1 จำกัดเวลาและจำนวนครั้งต่อฟีเจอร์
- ตัวชี้วัดเพิ่มขึ้นอย่างต่อเนื่อง การถดถอยให้ย้อนกลับทันที
- migration โครงสร้างพื้นฐาน เงิน ให้ส่งต่อให้คน
- หลังรีวิวล้มเหลวหลายครั้ง ให้เริ่มฟีเจอร์ใหม่ด้วยบริบทสะอาด
เช็กลิสต์ก่อนเริ่ม agent
- มี AGENTS.md: stack วิธีเริ่ม คำสั่งตรวจสอบ DoD
- make check ผ่านบน clone ที่สะอาด
- สภาพแวดล้อมทำซ้ำได้: ไฟล์ล็อก Docker หรือ devcontainer
- agent มีคำสั่งที่จำเป็น คำสั่งอันตรายถูกห้ามหรืออยู่ใน sandbox
- มี E2E อย่างน้อยสำหรับสถานการณ์หลัก
- มี PROGRESS.md และกฎให้อ่านเมื่อเริ่มเซสชัน
- ฟีเจอร์ในรายการมีสถานะ และมี active เพียงหนึ่งรายการ
- สถานะ passing ถูกตั้งโดยสคริปต์
- ข้อความการตรวจสอบมี WHY และ FIX
- งานมีเกณฑ์การยอมรับและขอบเขตที่ชัดเจน
- ระบุแล้วว่าอะไรต้องการการตัดสินใจจากคน
- วัด verification gap ก่อนการเปลี่ยนแปลง เพื่อให้มีค่าให้เปรียบเทียบ
ตัวชี้วัดของ harness
| ตัวชี้วัด | วิธีคำนวณ |
|---|---|
| Verification gap | สัดส่วนของ «เสร็จ» ที่ไม่มีการยืนยันจากการตรวจสอบ บนงาน 10 ชิ้น |
| MTTR | เวลาตั้งแต่พังจนกลับสู่สถานะทำงาน |
| Cold start | เซสชันใหม่ตอบได้ไหมว่า «เราอยู่ที่ไหน ต่อไปทำอะไร» โดยไม่ต้องเดา |
| Ablation | การลดลงเมื่อปิดระบบย่อยหนึ่งตัวบนชุดงานที่ตรึงไว้ |
สรุป
Harness เป็นวงปิดไม่ใช่ไฟล์เดียว ประกอบด้วยคำสั่ง เครื่องมือ สภาพแวดล้อม สถานะ และวงป้อนกลับ เริ่มจากการตรวจสอบ เก็บ AGENTS.md ให้สั้น มอบสถานะ «เสร็จ» ให้สคริปต์ และทบทวน harness เป็นประจำ ทั้งหมดนี้ถูกประกอบเข้าด้วยกันบนโปรเจกต์จริงในหลักสูตร harness engineering
คำถามที่พบบ่อย
AGENTS.md ต่างจาก CLAUDE.md อย่างไร?
ในแง่วัตถุประสงค์เหมือนกัน คือเป็นไฟล์คำสั่งสำหรับ agent CLAUDE.md ถูกอ่านโดย Claude Code ส่วน AGENTS.md เป็นรูปแบบกลางสำหรับ agent หลายตัว ใน CLAUDE.md สามารถอ้างถึง AGENTS.md ได้เลย
AGENTS.md ควรมีกี่บรรทัด?
ไม่มีขีดจำกัดตายตัว แต่ไฟล์หลักควรสั้น ประมาณหลักร้อยบรรทัดลงมาเหมือนสารบัญ รายละเอียดแยกไปเอกสารอื่น
โปรเจกต์เล็กจำเป็นต้องมี feature_list.json หรือไม่?
สำหรับการแก้ไขเล็กน้อยไม่จำเป็น จะคุ้มค่าเมื่อ agent ทำหลายฟีเจอร์ติดต่อกันหรือหลายเซสชัน
ควรเก็บความลับที่ agent ต้องเข้าถึงไว้ที่ไหน?
ในตัวแปรสภาพแวดล้อมหรือตัวจัดการความลับ ไม่ใช่ในไฟล์คำสั่งหรือในโค้ด agent ได้สิทธิ์เข้าถึงสภาพแวดล้อม ไม่ใช่ค่าที่เขียนเป็นข้อความ
หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Harness Engineering: инженерия надёжности AI-агентов”
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл