เรียนรู้การใช้ Claude Code เพื่อตรวจจับการคลาดเคลื่อนของเอกสาร เพื่อให้ README, เอกสาร API และ runbook สอดคล้องกับโค้ด โดยการสร้าง diffs และชี้จุดข้อขัดแย้ง

\nCheck these docs for drift: README.md, docs/api.md, runbooks/deploy.md.\nCompare them to the current repo.\nOutput:\n1) Contradictions list (doc claim -> repo evidence with file path and line range)\n2) Unified diffs for the smallest safe edits\nRules: do not rewrite sections that are still accurate.\n\n\nถ้า Claude บอกว่า "API ใช้ /v2" ให้มันสำรองด้วยการชี้ไปที่ router, OpenAPI spec, หรือ integration test ถ้ามันหาไม่ได้ ควรแจ้งว่าไม่พบหลักฐาน\n\n### กำหนดขอบเขตก่อนแก้ไข\n\nDrift มักเริ่มจากการเปลี่ยนโค้ดครั้งเดียวที่กระทบเอกสารหลายที่ ให้ Claude กำหนดขอบเขตก่อน: มีอะไรเปลี่ยน ที่ไหนเปลี่ยน เอกสารไหนน่าจะพัง และการกระทำของผู้ใช้จะได้รับผลกระทบอย่างไร\n\nตัวอย่าง: คุณเปลี่ยนชื่อ env var จาก API_KEY เป็น SERVICE_TOKEN รายงานที่มีประโยชน์จะค้นหาทุกที่ที่ชื่อเก่าอยู่ (การตั้งค่า README, ตัวอย่าง API, ส่วนความลับใน runbook) แล้วสร้าง diff กระชับที่อัปเดตเฉพาะบรรทัดเหล่านั้นและคำสั่งตัวอย่างที่ตอนนี้จะผิดพลาดเท่านั้น\n\n## ตั้ง workflow ง่าย ๆ ก่อนจะพิมพ์พรอมต์ใด ๆ\n\nถ้าคุณชี้โมเดลไปที่ "เอกสารทั้งหมด" โดยไม่มีกฎ มันมักจะเขียนใหม่ทั้งเอกสารแล้วยังมีข้อเท็จจริงผิด แนะนำ workflow ง่าย ๆ ที่ทำให้การเปลี่ยนแปลงเล็ก ทำซ้ำได้ และรีวิวได้ง่าย\n\nเริ่มจากชุดเอกสารหนึ่งชุด: README, อ้างอิง API หรือ runbook หนึ่งชุดที่คนใช้จริง การแก้ปัญหาในหนึ่งพื้นที่ครบวงจรจะสอนสัญญาณที่เชื่อถือได้ก่อนขยายผล\n\n### ตัดสินใจว่าต้นทางข้อมูลคือที่ไหน\n\nเขียนสิ่งที่ชัดเจนเป็นคำธรรมดาว่าข้อเท็จจริงควรมาจากไหนสำหรับชุดเอกสารนั้น\n\n- สำหรับ README: ผลลัพธ์ CLI help และแอปลักษณ์ตัวอย่างที่ทำงานได้\n- สำหรับเอกสาร API: คำนิยาม router พร้อม integration tests\n- สำหรับ runbooks: คอนฟิกการดีพลอยและการแจ้งเตือนที่กระตุ้นขั้นตอนนั้น\n\nเมื่อคุณระบุแหล่งเหล่านี้แล้ว พรอมต์จะคมขึ้น: "เปรียบเทียบ README กับผลลัพธ์ CLI ปัจจุบันและค่าเริ่มต้นในคอนฟิก แล้วสร้างแพตช์"\n\n### เลือกผลลัพธ์ที่รีวิวเร็ว\n\nตกลงรูปแบบผลลัพธ์ก่อนให้ใครสักคนรันการเช็คครั้งแรก การผสมรูปแบบทำให้ยากที่จะเห็นว่าอะไรเปลี่ยนและทำไม\n\nกฎง่าย ๆ:\n\n- ขอ diff สำหรับทุกการเปลี่ยนแปลงเอกสาร พร้อมเหตุผลสั้นหนึ่งประโยค\n- อนุญาตรายการข้อขัดแย้งสั้น ๆ เฉพาะเมื่อเครื่องมือไม่สามารถแนะนำคำที่ปลอดภัยได้\n- เก็บ diff ให้จำกัดที่ไฟล์เดียวต่อการเปลี่ยนเมื่อเป็นไปได้\n- ให้ความสำคัญกับตัวอย่างที่ล้มเหลว (คำสั่ง, คำขอ, ตัวอย่างโค้ด) มากกว่าการเขียนโดยรวม\n\nนิสัยปฏิบัติ: เพิ่มบันทึกเล็ก ๆ ใน PR เอกสารว่า "Source of truth checked: routes + tests" เพื่อให้ผู้รีวิวรู้ว่าเปรียบเทียบกับอะไร นั่นทำให้การอัปเดตเอกสารจาก "ดูโอเค" เป็น "ตรวจสอบแล้วกับสิ่งจริง"\n\n## ขั้นตอนทีละขั้น: ทำให้เอกสารสอดคล้องกับโค้ดทุกการเปลี่ยนแปลง\n\nปฏิบัติต่อแต่ละการเปลี่ยนโค้ดเหมือนเป็นการสืบสวนเอกสาร จุดประสงค์คือจับข้อขัดแย้งเร็วและสร้างแพตช์เล็กที่ผู้รีวิวเชื่อถือได้\n\nเริ่มโดยเลือกไฟล์ที่ต้องตรวจสอบชัดเจนและคำถามเกี่ยวกับ drift ที่ชัดเจน เช่น: "เราเปลี่ยน env vars, flags ของ CLI, เส้นทาง HTTP, หรือรหัสข้อผิดพลาดที่เอกสารยังพูดถึงหรือไม่?" ความเฉพาะเจาะจงช่วยให้โมเดลไม่เขียนใหม่ทั้งส่วน\n\nจากนั้นให้ Claude Code ดึงข้อเท็จจริงแข็ง ๆ จากโค้ดก่อน ขอให้มันแสดงรายการเฉพาะเท่านั้น: คำสั่งที่ผู้ใช้รัน, endpoints และเมธอด, ฟิลด์ของคำขอและคำตอบ, คีย์คอนฟิก, env vars ที่บังคับ, และขั้นตอนปฏิบัติการที่อ้างอิงโดยสคริปต์หรือคอนฟิก ถ้าไม่พบ ให้ระบุว่า "not found" แทนการเดา\n\nแล้วขอเทเบิลเปรียบเทียบง่าย ๆ: ข้อกล่าวหาในเอกสาร, สิ่งที่โค้ดแสดง, และสถานะ (match, mismatch, missing, unclear) นั่นช่วยให้การอภิปรายมีพื้นฐาน\n\nหลังจากนั้นขอ unified diff ที่แก้ไขเล็กที่สุด บอกให้เปลี่ยนเฉพาะบรรทัดที่จำเป็นเพื่อแก้ความไม่ตรงกัน รักษาสไตล์เอกสารเดิม และหลีกเลี่ยงการเพิ่มคำสัญญาที่ไม่มีหลักฐานจากโค้ด\n\nจบด้วยสรุปสำหรับผู้รีวิวสั้น ๆ: อะไรเปลี่ยน ทำไมเปลี่ยน และสิ่งที่ต้องตรวจสอบเป็นพิเศษ (เช่น env var ที่ถูกเปลี่ยนชื่อ หรือ header ที่ต้องเพิ่ม)\n\n## เอกสาร API: วิธีปฏิบัติในการยืนยัน endpoints และตัวอย่าง\n\nเอกสาร API ล้าสมัยเมื่อโค้ดเปลี่ยนเงียบ ๆ: เส้นทางถูกเปลี่ยนชื่อ ฟิลด์กลายเป็นบังคับ หรือรูปแบบข้อผิดพลาดเปลี่ยน ผลลัพธ์คือการผสานระบบพังและเวลา debugging สูญเสียไป\n\nกับ Claude Code เป้าหมายคือพิสูจน์ว่า API ทำอะไรจากรีโป แล้วชี้ความไม่ตรงกันในเอกสาร ขอให้มันดึง inventory จาก routing และ handlers (paths, methods, request และ response models) แล้วเปรียบเทียบกับสิ่งที่เอกสาร API อ้าง\n\nให้ความสำคัญกับสิ่งที่คนมักก็อปปี้: คำสั่ง curl, headers, payload ตัวอย่าง, status codes, และชื่อฟิลด์ ในพรอมต์เดียวให้ตรวจ:\n\n- ข้อกำหนดการยืนยันตัวตน (headers, ประเภทโทเคน, endpoints สาธารณะ)\n- พารามิเตอร์ pagination และค่าเริ่มต้น\n- รหัสสถานะข้อผิดพลาดและรูปแบบ JSON\n- พฤติกรรมการเวอร์ชัน (v1 เทียบกับ v2)\n- ตัวอย่างตรงกับกฎการ validate ปัจจุบันหรือไม่\n\nเมื่อพบความไม่ตรงกัน ให้ยอมรับเฉพาะ diffs ที่สามารถอ้างอิงหลักฐานจากโค้ดได้ (เช่น นิยาม route, พฤติกรรม handler, หรือสคีมา) นั่นช่วยให้แพตช์เล็กและตรวจทานได้\n\nตัวอย่าง: โค้ดตอนนี้คืน 201 บน POST /widgets และเพิ่มฟิลด์ name ที่เป็นบังคับ เอกสารยังแสดง 200 และละไว้ไม่กล่าวถึง name ผลลัพธ์ที่ดีจะชี้ทั้งสองความขัดแย้งและอัปเดตแค่รหัสสถานะและ JSON ตัวอย่างของ endpoint นั้น ทิ้งส่วนอื่นไว้เหมือนเดิม\n\n## Runbook: ลดเวลาหยุดชะงักจากขั้นตอนที่ล้าสมัย\n\nRunbook ล้มเหลวในแบบที่มีต้นทุนสูงที่สุด: มันดูครบถ้วนแต่ขั้นตอนไม่ตรงกับระบบปัจจุบัน การเปลี่ยนเล็ก ๆ เช่น การเปลี่ยนชื่อ env var หรือคำสั่งดีพลอยใหม่ สามารถทำให้เหตุการณ์ยืดเยื้อเพราะผู้ตอบเหตุการณ์ทำตามคำสั่งที่ใช้ไม่ได้\n\nปฏิบัติต่อ runbook เหมือนโค้ด: ขอ diff เทียบกับรีโปปัจจุบันและต้องมีการชี้ข้อขัดแย้ง เปรียบเทียบกับสิ่งที่ระบบใช้ตอนนี้: สคริปต์, ค่าเริ่มต้นคอนฟิก, และเครื่องมือที่ใช้จริง\n\nเน้นจุดล้มเหลวที่ทำให้เกิดการวนซ้ำมากที่สุดในเหตุการณ์:\n\n- คำสั่งที่ระบุตรงกับสคริปต์และ flags ปัจจุบันหรือไม่?\n- ค่า config "เริ่มต้น" ตรงกับที่แอปส่งมาหรือไม่?\n- env vars และ secrets ที่จำเป็นถูกอ้างอิงโดยโค้ดและคอนฟิกดีพลอยหรือไม่?\n- ขั้นตอนดีพลอยและ rollback ตรงกับเครื่องมือปล่อยเวอร์ชันปัจจุบันและการตั้งชื่อหรือไม่?\n- ค่า "ที่รู้ว่าดี" (พอร์ต, โซน, timeouts) ยังตรงกับความจริงหรือไม่?\n\nยังให้เพิ่มการตรวจสอบด่วนและผลลัพธ์ที่คาดหวังเพื่อให้ผู้ตอบเหตุการณ์รู้ว่ากำลังไปถูกทางหรือไม่ การบอกว่า "ตรวจสอบว่าทำงานได้" ไม่พอ ให้ระบุสัญญาณที่คาดหวังอย่างชัดเจน (เช่น status line, version string, หรือผล health check)\n\nถ้าคุณสร้างและดีพลอยแอปบนแพลตฟอร์มอย่าง Koder.ai เรื่องนี้ยิ่งสำคัญเพราะ snapshot และ rollback ใช้ได้ก็ต่อเมื่อ runbook ระบุการดำเนินการที่ถูกต้องและสะท้อนเส้นทางการกู้คืนปัจจุบัน\n\n## ความผิดพลาดที่พบบ่อยซึ่งทำให้ drift แย่ลง\n\nวิธีที่เร็วที่สุดในการสร้าง drift คือการมองเอกสารเป็น "งานเขียนสวยงาม" แทนที่จะเป็นชุดข้อกล่าวหาที่ต้องตรงกับโค้ด\n\n### ความผิดพลาดที่ทำให้การสอดคล้องหายไปเงียบ ๆ\n\nการขอให้โมเดลเขียนใหม่ก่อนตรวจข้อขัดแย้งเป็นความผิดพลาดทั่วไป เมื่อข้ามการตรวจสอบข้อขัดแย้ง คุณอาจได้ข้อความที่ลื่นขึ้นแต่ยังบรรยายพฤติกรรมผิดเสมอ ให้เริ่มด้วยการถามว่าเอกสารอ้างว่าอะไร โค้ดทำอะไร และจุดไหนไม่ตรงกัน\n\nอีกความผิดพลาดคือปล่อยให้โมเดลเดา หากพฤติกรรมไม่ปรากฏในโค้ด เทสต์ หรือคอนฟิก ให้ถือว่าเป็นไม่ทราบ คำว่า "อาจจะ" เป็นวิธีที่ README มักสัญญาเกินจริงและ runbook กลายเป็นนิยาย\n\nปัญหาเหล่านี้มักปรากฏในการอัปเดตประจำวัน:\n\n- อัปเดตส่วนหนึ่งแต่ปล่อยให้ตัวอย่าง ข้อความแสดงข้อผิดพลาด และกรณีพิเศษยังเป็นของเดิม\n- เปลี่ยนชื่อแนวคิดในที่เดียว (README) แต่ไม่เปลี่ยนในเอกสาร API, คีย์คอนฟิก, หรือ runbook\n- แก้คำอธิบาย endpoint แต่ลืมตัวอย่าง request/response\n- เปลี่ยนพฤติกรรมแต่ไม่อัปเดตค่าเริ่มต้นหรือหมายเหตุข้อจำกัด\n- ผสานการแก้ไขเอกสารโดยไม่มีบรรทัดสั้น ๆ ว่า "ทำไมเปลี่ยน" ในสรุป diff\n\n### ตัวอย่างสั้น ๆ\n\nhandler เปลี่ยนจากคืน 401 เป็น 403 สำหรับโทเคนหมดอายุ และชื่อ header เปลี่ยนจาก X-Token เป็น Authorization ถ้าคุณแก้เฉพาะส่วน auth คุณอาจพลาดว่าตัวอย่าง API ยังแสดง header เก่า และ runbook ยังคอยดูว่าเกิด spike ของ 401\n\nเมื่อคุณสร้าง diffs ให้เพิ่มบรรทัดสรุปการตัดสินใจสั้น ๆ เช่น: "Auth failures now return 403 to distinguish invalid vs missing credentials." นั่นป้องกันไม่ให้คนถัดไป "แก้" เอกสารกลับเป็นพฤติกรรมเก่าDocumentation drift คือเมื่อเอกสารของคุณค่อย ๆ ไม่ตรงกับสิ่งที่โค้ดทำจริง โดยปกติเริ่มจากการเปลี่ยนแปลงเล็กน้อย (เช่น ชื่อ env var ถูกเปลี่ยน, ฟิลด์ที่จำเป็นเพิ่มขึ้น, หรือรหัสสถานะเปลี่ยน) ที่ไม่ได้อัปเดตใน README, ตัวอย่าง API หรือ runbook
เพราะโค้ดเปลี่ยนภายใต้ความกดดัน แต่เอกสารไม่ได้รับการบังคับใช้อย่างเคร่งครัด
สาเหตุที่พบบ่อย:
เริ่มจากเอกสารที่คนใช้ปฏิบัติตามจริง ๆ ไม่ใช่เอกสารที่เป็นแค่ “nice to have” ลำดับที่แนะนำ:
การแก้จุดเหล่านี้ก่อนลดความเสียหายได้มากที่สุด
เพราะการแต่งประโยคให้สวยไม่ได้ทำให้ข้อมูลถูกต้องเสมอไป Drift เกิดจากคำกล่าวที่ผิด
แนวทางที่ดีกว่า: พิจารณาเอกสารเป็นข้อความที่ทดสอบได้ เช่น “รันคำสั่งนี้”, “เรียก endpoint นี้”, “ตั้งตัวแปรนี้” แล้วตรวจสอบข้อกล่าวหาเหล่านั้นกับรีโป ปรับแต่งโค้ด และผลลัพธ์จริง
ขอผลลัพธ์สองอย่าง:
และกำหนดว่า: ถ้ามันหาเอกสารยืนยันในรีโปไม่ได้ ต้องบอกว่า “not found” แทนการเดา
เพราะ diff ทำให้ผู้รีวิวเห็นการเปลี่ยนแปลงได้เร็ว การเปลี่ยนแบบย่อช่วยลดการเขียนใหม่ที่แฝงข้อกล่าวหาใหม่
ค่าเริ่มต้นที่ดี: หนึ่งไฟล์ต่อ diff เมื่อเป็นไปได้ และแต่ละการเปลี่ยนมีเหตุผลสั้น ๆ ผูกกับหลักฐานในรีโป
ให้มันอ้างหลักฐาน:
แนวปฏิบัติ:
เช็คส่วนที่ผู้คนมักก็อปปี้:
ถ้ารายการ endpoint ถูกแต่ตัวอย่างผิด ผู้ใช้ก็ยังล้มเหลว—ให้ถือว่าตัวอย่างมีความสำคัญสูง
Runbook ล้าสมัยเมื่อความเป็นจริงของการปฏิบัติการเปลี่ยนไป
ตรวจสอบจุดสำคัญ:
ถ้าผู้ตอบเหตุการณ์ตรวจสอบความคืบหน้าไม่ได้ พวกเขาจะเสียเวลาในเหตุการณ์
กฎง่าย ๆ “แหล่งความจริง” ต่อประเภทเอกสาร:
แล้วฝังเข้ากับ workflow: รันการตรวจ drift บนเอกสารที่ได้รับผลกระทบต่อ PR และเก็บการแก้ไขให้เล็กและตรวจทานได้ง่าย