Claude เขียนโค้ด เกิดข้อผิดพลาดในการทดสอบ แล้วมันก็ส่งข้อผิดพลาดกลับมาให้คุณจัดการเอง
เอเจนต์ที่ซ่อมแซมตัวเองไม่ได้ทำแบบนั้น มันอ่านความล้มเหลวของมันเอง แก้ไขสาเหตุ แล้วรันใหม่จนกว่าทุกอย่างจะผ่าน
ตั้งค่าครั้งเดียว แล้วคุณจะเลิกเป็นคนดีบักฟรีให้กับเอเจนต์ของคุณ
นี่คือการตั้งค่าที่คุณต้องทำทั้งหมด 👇
ก่อนที่เราจะลงรายละเอียด ฉันแชร์บันทึกประจำวันเกี่ยวกับ AI และการเขียนโค้ดแบบ Vibe Coding ไว้ในช่อง Telegram ของฉัน: https://t.me/zodchixquant🧠

ทำไมการรันครั้งเดียวถึงไม่พอ
โดยค่าเริ่มต้น Claude จะรันงานเพียงครั้งเดียว เมื่อเทสต์ล้มเหลว มันจะรายงานข้อผิดพลาดและรอต่อไป คุณต้องอ่านข้อผิดพลาดนั้น วางกลับเข้าไป แล้วบอกให้มันลองใหม่ คุณกำลังทำหน้าที่ดีบัก ในขณะที่มันแค่พิมพ์ตาม
เอเจนต์ที่ซ่อมแซมตัวเองจะพลิกบทบาทนั้น มันอ่านความล้มเหลวของตัวเอง คิดหาว่าข้อผิดพลาดเป็นประเภทไหน แก้ไขสาเหตุนั้น แล้วรันใหม่ เหมือนกับวิธีคิดของดีบักเกอร์ คุณจะเข้ามาเกี่ยวข้องก็ต่อเมื่อมันผ่าน หรือเมื่อมันติดขัดจริงๆ เท่านั้น
ไฟล์ที่ 1: คำสั่ง fix
นี่คือลูปที่คุณจะรันจริงๆ วางในไฟล์ .claude/commands/fix.md:
1---2description: รันงานและซ่อมแซมตัวเองจนกว่าเทสต์ทั้งหมดจะผ่าน3argument-hint: <task>4allowed-tools: Read, Write, Edit, Glob, Grep, Bash5model: sonnet6---78Task: $ARGUMENTS910Loop:111. Implement the task.122. Run the test suite: `npm test` (or pytest, cargo test).133. If all tests pass: stop and show me the result.144. If a test fails: classify the error type, name the root cause,15 fix that cause, then go back to step 2.165. Cap at 5 attempts. Announce the attempt number each round.1718The classify-then-fix order is the whole point. Diagnosis before19edit, every round. Never weaken a test to pass, fix the code.
คุณพิมพ์ /fix เพิ่ม pagination ให้กับ endpoint ผู้ใช้ แล้วเอเจนต์จะเขียนโค้ด ทดสอบ และซ่อมแซมตัวเองไปเรื่อยๆ จนกว่าเทสต์ทั้งหมดจะผ่าน
ไฟล์ที่ 2: ฮุคตรวจสอบอัตโนมัติ
คำสั่งนี้ทำงานเมื่อคุณเรียกใช้ ฮุคจะทำให้การตรวจสอบตัวเองเกิดขึ้นอัตโนมัติทุกครั้งที่มีการแก้ไข
เพิ่มในไฟล์ .claude/settings.json:
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Write|Edit",6 "hooks": [7 { "type": "command", "command": "npm test --silent 2>&1 | tail -5 || echo 'TESTS FAILING, fix before continuing'" }8 ]9 }10 ]11 }12}
ตอนนี้ทุกครั้งที่ Claude แก้ไขไฟล์ การทดสอบจะทำงานและผลลัพธ์จะกลับมาอยู่ในมุมมองของมันทันที
ข้อผิดพลาดจะแสดงขึ้นมาทันที ทำให้เอเจนต์แก้ไขมันในโฟลว์เดียวกัน โดยไม่ต้องข้ามไปทำอย่างอื่นแล้วเพิ่มการเปลี่ยนแปลงซ้อนทับบนโค้ดที่เสีย
ไฟล์ที่ 3: สอนให้มันอ่านข้อผิดพลาด
นี่คือไฟล์ที่แยกดีบักเกอร์ตัวจริงออกจากนักเดาสุ่ม เอเจนต์ส่วนใหญ่เห็น "test failed" แล้วก็เริ่มแก้ไขแบบสุ่ม
เอเจนต์ที่ดีจะอ่านประเภทของข้อผิดพลาดก่อน เพราะแต่ละประเภทชี้ไปที่สาเหตุที่แตกต่างกัน ใส่นี้ใน CLAUDE.md:
1## How to read a failure before fixing it23Always name the error type first. Each one means something different:45- Assertion failure (expected X, got Y): the logic is wrong.6 Trace back from the assertion to where the value was built.7 Fix the calculation, not the test's expectation.89- Type error / undefined is not a function: a shape mismatch.10 Something is null, or the wrong type reached this line.11 Find where that value originates, guard or correct it there.1213- Timeout / hang: an await is missing, or a promise never resolves.14 Look for async calls without await, or a condition that never flips.1516- Import / module not found: a path or dependency problem, not logic.17 Fix the path or install, do not touch the code that uses it.1819- Flaky (passes sometimes): shared state or timing, never random.20 Look for order-dependent tests or unmocked time/network.2122Rule: state the type and the one-sentence root cause out loud23before editing. If you can't name the cause, you're guessing. Stop.
ข้อผิดพลาดแบบ Type error และ Assertion failure ต้องการการแก้ไขที่ตรงกันข้าม: อย่างหนึ่งคือปัญหาด้านโครงสร้างข้อมูลที่ต้นทาง อีกอย่างคือตรรกะที่ผิด ณ จุดนั้น จำแนกก่อน แล้วเอเจนต์จะแก้ไขสิ่งที่ถูกต้อง
ถ้าข้ามขั้นตอนนี้ มันจะแก้ไขแบบสุ่มจนกว่าสีแดงจะหายไป ซึ่งนั่นคือวิธีที่คุณจะได้ชุดเทสต์ที่ผ่านแต่ยังมีบั๊กซ่อนอยู่
สิ่งที่คุณเห็นจริงๆ
คุณพิมพ์บรรทัดเดียว:
1/fix ตัวจัดรูปแบบวันที่คืนค่าเขตเวลาไม่ถูกต้อง
จากนั้นมันก็ทำงานเอง:
1ครั้งที่ 12 รันเทสต์ → ล้มเหลว3 ประเภท: assertion (คาดว่า 5 แต่ได้ 11)4 สาเหตุ: หน้าเพจไม่ได้ถูกนำไปใช้กับคิวรี5 แก้ไข LIMIT clause67ครั้งที่ 28 รันเทสต์ → ล้มเหลว9 ประเภท: type error (offset ไม่ได้กำหนด)10 สาเหตุ: หน้าที่ 1 ไม่ได้ส่ง offset ตั้งค่าเริ่มต้นผิด11 เพิ่ม offset = (page-1)*size1213ครั้งที่ 314 รันเทสต์ → ผ่านทั้งหมด (7/7)1516แก้ไขเสร็จใน 3 ครั้ง ต้องการตรวจสอบ diff ไหม?
คุณไม่ต้องวางข้อผิดพลาดกลับไป มันอ่านความล้มเหลวของตัวเอง ระบุสาเหตุแต่ละอย่าง และแก้ไขจนกว่าชุดเทสต์จะผ่าน
ข้อผิดพลาดที่พบบ่อย
แก้ไขก่อนวินิจฉัย ข้อผิดพลาดที่ใหญ่ที่สุด เอเจนต์ที่แก้ไขก่อนระบุประเภทของข้อผิดพลาดกำลังเดาสุ่ม และการเดาสุ่มจะทำให้สีแดงกลายเป็นสีเขียวด้วยโชค ไม่ใช่ด้วยการแก้ไข กฎการจำแนกก่อนคือแนวป้องกันทั้งหมด
ปฏิบัติต่อข้อผิดพลาดทุกประเภทเหมือนกัน ข้อผิดพลาดแบบ Timeout และ Assertion failure ไม่มีอะไรเหมือนกัน แต่เอเจนต์ที่ไม่มีคู่มือประเภทข้อผิดพลาดจะปฏิบัติต่อทั้งสองอย่างว่า "มีอะไรผิดพลาด" และแก้ไขบรรทัดที่ใกล้ที่สุด ครึ่งหนึ่งของการแก้ไขของคุณจะไปอยู่ผิดไฟล์
แก้ที่อาการ การห่อการเรียกที่เกิดข้อผิดพลาดด้วย try/catch ทำให้เทสต์ผ่านแต่ปล่อยบั๊กไว้ โปรโตคอลห้ามการปิดเสียงข้อผิดพลาดด้วยเหตุผลนี้
ปล่อยให้มันทำให้เทสต์อ่อนแอลง เอเจนต์ที่ได้รับอนุญาตให้แก้ไขเทสต์จะลบเทสต์ที่ล้มเหลวในที่สุดเพื่อให้ถึงสถานะผ่าน ชุดเทสต์ที่ผ่านแต่ไม่ได้พิสูจน์อะไรเลยคือผลลัพธ์ที่แย่ที่สุด ดังนั้นกฎนี้จึงไม่สามารถต่อรองได้
การตั้งค่าใช้เวลา 5 นาที
2 นาที: สร้างไฟล์ .claude/commands/fix.md
1 นาที: เพิ่ม PostToolUse hook ลงใน settings.json
1 นาที: เพิ่มโปรโตคอลดีบักตัวเองลงใน CLAUDE.md
1 นาที: รัน /fix บนบั๊กที่รู้จัก แล้วดูมันทำงานแก้สาเหตุทีละครั้ง
คุณจะเลิกเป็นมนุษย์ที่คอยส่งต่อข้อผิดพลาด เอเจนต์อ่านสีแดงของมันเองและแก้ไขจนกว่าจะเป็นสีเขียวมันไม่ได้ฉลาดขึ้น แค่มันหยุดส่งปัญหากลับมาให้คุณ
ขอบคุณที่อ่าน!
ฉันแชร์บันทึกประจำวันเกี่ยวกับ AI การเงิน และการเขียนโค้ดแบบ Vibe Coding ไว้ในช่อง Telegram ของฉัน: https://t.me/zodchixquant






