คืนวันที่ 11 สิงหาคม 2026 เรานั่งไล่โค้ดของสคริปต์ตัวตรวจที่เขียนเอง แล้วเจอเรื่องที่ทำให้หยุดไปพักหนึ่ง
ในเอกสารกติกาของระบบเรา มีบรรทัดหนึ่งเขียนไว้ตั้งแต่ 5 กรกฎาคม ว่า โมเดลที่ตรวจงาน ต้องไม่ใช่โมเดลเดียวกับที่ทำงานนั้น เหตุผลก็ตรงไปตรงมา โมเดลตัวเดียวกันมีจุดบอดชุดเดียวกัน สิ่งที่มันมองข้ามตอนเขียน มันก็จะมองข้ามตอนตรวจด้วยเหตุผลเดิมเป๊ะ
กติกานั้นถูกทำตามมาตลอดหนึ่งเดือนกว่า แต่พอเปิดสคริปต์ที่สั่งตัวตรวจจริงๆ ปรากฏว่ามันฝังชื่อโมเดลไว้ตายตัว และไม่รู้จักคำว่า "โมเดลของคนทำ" เลยสักคำ แปลว่าวันไหนคนที่เขียนงานบังเอิญเป็นโมเดลตัวเดียวกัน กติกาข้อนั้นจะถูกละเมิดโดยไม่มีอะไรร้อง และไม่มีใครรู้
มันถูกทำตามมาตลอดเพราะ คนที่สั่งจำได้ ไม่ใช่เพราะมีอะไรกันไว้ แปลว่าวันที่เรารีบ วันที่คนอื่นมาแก้ต่อ หรือวันที่ตี 2 กติกานั้นจะหายไปเงียบๆ พอดีกับวันที่มันสำคัญที่สุด
Productize ใช้ Codex CLI กับ Claude Code คู่กันในงานจริงทุกวัน ตัวหนึ่งเป็นคนเขียน อีกตัวเป็นคนตรวจ บทความนี้เล่าว่าสองตัวนี้ต่างกันตรงไหนจากการวัดของเราเอง ทำไมคำถาม "ตัวไหนดีกว่า" ถึงเป็นคำถามที่ให้ผลตอบแทนน้อยกว่าที่คิด และวิธีเปลี่ยนกฎที่นอนอยู่ในเอกสาร ให้กลายเป็นโค้ดที่ปฏิเสธเราได้
ช่วงที่ 1Codex กับ Claude Code ต่างกันตรงไหน
ต่างที่ค่ายผู้ผลิตกับนิสัยการอ่านโค้ด ไม่ได้ต่างที่ "ตัวหนึ่งทำได้ อีกตัวทำไม่ได้" ทั้งคู่เขียนโค้ดได้ ทั้งคู่รีวิวความเปลี่ยนแปลงในโค้ดได้ ทั้งคู่สั่งแบบไม่มีหน้าจอได้ ตารางข้างล่างมาจากการใช้จริงในบ้านเรา ไม่ใช่คะแนนสอบจากที่อื่น
| เทียบที่ | Claude Code | Codex CLI |
|---|---|---|
| ค่ายผู้ผลิต | Anthropic | OpenAI |
| บทบาทที่เราให้ | คนเขียนเป็นหลัก | คนตรวจเป็นหลัก |
| รีวิว diff ในตัว | ได้ มีคำสั่งในตัว | ได้ codex review เลือกได้ว่าเทียบกับ branch หลัก งานที่ยังไม่ commit หรือ commit เดียว |
| สั่ง headless | claude -p | codex exec |
| ระดับคิดเริ่มต้น | ตั้งเองต่อเลนงาน | ต้องระวัง รุ่นเรือธงตั้งมาที่ระดับต่ำ ดูช่วงที่ 4 |
| ตอนสิทธิ์หมดอายุ | ฟ้องตรงไปตรงมา | เคยหลอกเรา จบด้วยรหัสศูนย์พร้อมไฟล์รายงานเปล่า |
| ทำไมต้องสองตัว | คนละค่าย แปลว่าจุดบอดไม่ทับกัน และนั่นคือสิ่งเดียวที่ทำให้การตรวจมีความหมาย | |
สังเกตว่าไม่มีแถวไหนบอกว่าใครเขียนโค้ดสวยกว่า เพราะนั่นคือแถวที่เปลี่ยนทุกครั้งที่มีรุ่นใหม่ออก และเป็นแถวที่ตัดสินใจแทนเราไม่ได้อยู่ดี
ช่วงที่ 2แล้วตัวไหน ดีกว่ากัน
คำถามนี้ตอบไม่ได้ในรูปแบบที่ทุกคนอยากได้ และวันที่เราวัดจริง ผลที่ออกมาน่าสนใจกว่าคำตอบที่อยากได้เสียอีก
เรามีงานชิ้นหนึ่งที่เขียนด้วยโมเดลของ Anthropic แล้วส่งให้ตรวจสามรอบ รอบแรกกับรอบสองใช้ตัวตรวจจากค่ายเดียวกับคนเขียน ได้ปัญหามารอบละหลายข้อ ทุกข้อเป็นของจริง แก้ไปเรียบร้อย พอถึงรอบสามเราสลับตัวตรวจเป็น Codex ทั้งที่โค้ดผ่านสายตามาสองรอบแล้ว
รอบนั้นมันเจอเพิ่ม สามข้อที่สองรอบก่อนหน้ามองไม่เห็น ทั้งสามเป็นคนละแนวกับที่เคยเจอ
- ช่องที่ยัดอักขระพิเศษเข้าไปในชื่อทีม แล้วมันไปกลายเป็นส่วนหนึ่งของรูปแบบการค้นหา (regex) ทำให้พฤติกรรมเพี้ยนได้
- การจัดรูปตัวอักษรยูนิโค้ดให้เป็นมาตรฐานเดียวกัน ที่ทำไว้แค่ครึ่งทาง ชื่อเดียวกันจึงเทียบกันไม่ติดในบางเส้นทาง
- กติกาตอนเปิดระบบที่ไปตรวจข้อมูลคนละก้อนกับที่โปรแกรมปลายทางอ่านจริง คือตรวจแล้วแต่ตรวจผิดที่
ประเด็นไม่ใช่ Codex เก่งกว่า ถ้าสลับกันเป็น Codex เขียนแล้วให้ Claude ตรวจ เราคาดว่าจะได้ผลแบบเดียวกันในทิศตรงข้าม ประเด็นคือ สองตัวนี้ผิดคนละชุด และของที่โมเดลตัวหนึ่งมองไม่เห็น ไม่ได้แก้ด้วยการเอาโมเดลตัวนั้นรุ่นแรงขึ้นมาดูซ้ำ
ความหลากหลายที่ถูกบังคับ ให้ผลที่การอัปเกรดรุ่นให้ไม่ได้ เพราะรุ่นใหม่ของค่ายเดิม ยังแบกจุดบอดชุดเดิมมาด้วย
เรื่องนี้มีข้อควรระวังอยู่ด้วย การเปิดหลายโมเดลมาช่วยดูไม่ได้แปลว่ารอบคอบขึ้นอัตโนมัติ จังหวะที่ทุกตัวเห็นตรงกันหมดคือจังหวะที่ต้องระวังที่สุด เราเคยเขียนแยกไว้อีกเรื่องหนึ่งที่ การใช้ AI หลายค่ายช่วยหาจุดอ่อน
ช่วงที่ 3เปลี่ยนกฎในเอกสาร ให้เป็นโค้ด ที่ปฏิเสธได้
กลับมาที่คืนวันที่ 11 สิงหาคม สิ่งที่เจอไม่ใช่ว่ากติกาผิด กติกาถูกและเขียนไว้ชัด สิ่งที่เจอคือ ไม่มีที่ให้กติกานั้นยืน
คำถามที่ใช้จับเรื่องแบบนี้มีข้อเดียว และใช้ได้กับทุกกฎในทุกทีม
ตอนนี้ ถ้ามีคนทำตรงกันข้ามกับกฎข้อนี้ อะไรจะหยุดเขา
ถ้าคำตอบคือ "ความจำของคนสั่ง" หรือ "เดี๋ยวตอนรีวิวก็เห็นเอง" กฎข้อนั้นยังไม่ได้ถูกบังคับ มันเป็นแค่ความตั้งใจที่เขียนสวย
สามอย่างที่ทำให้มันบังคับได้จริง
เราแก้ด้วยการเขียนสคริปต์คั่นกลางตัวเล็กๆ ขึ้นมา คั่นระหว่างคำสั่ง "ไปตรวจงานให้ที" กับตัวตรวจจริง หลักการมีสามข้อ และสามข้อนี้ย้ายไปใช้กับกฎอื่นได้หมด
- ค่าที่กฎขึ้นอยู่กับ ต้องเป็นสิ่งที่ผู้เรียกต้องบอก และห้ามมีค่าตั้งต้น สคริปต์ของเราบังคับให้ส่งชื่อโมเดลของคนทำเข้ามา ไม่ส่งคือไม่รัน เหตุผลคือถ้าเดาได้ วันหนึ่งมันจะเดาผิดแล้วยังขึ้นว่าผ่าน แย่กว่าไม่มีตัวกันเลยด้วยซ้ำ
- ค่าที่ฝังตายในสคริปต์ คือกฎที่ตรวจตัวเองไม่ได้ ตัวเดิมฝังชื่อโมเดลตัวตรวจไว้ในโค้ด จึงไม่มีทางรู้ว่าตัวเองกำลังชนกับคนทำ ต้องดึงออกมาเป็นค่าที่ตั้งจากข้างนอก แล้วค่อยเอาไปเทียบ
- ต้องปรับชื่อให้อยู่ในรูปเดียวกันก่อนเทียบ คนเขียนแต่ละที่พิมพ์ชื่อโมเดลไม่เหมือนกัน บางที่ใส่เลขรุ่น บางที่ใส่ชื่อค่ายนำหน้า ถ้าเทียบสตริงตรงๆ มันจะผ่านเพราะตัวหนังสือไม่ตรง ทั้งที่ของจริงเป็นตัวเดียวกัน
แล้วมันปฏิเสธจริงไหม
ตรงนี้สำคัญกว่าตัวโค้ด เพราะตัวกันพลาดที่ไม่เคยเห็นตอนมันขึ้นแดง (ปฏิเสธ) คือตัวกันพลาดที่ยังพิสูจน์ไม่ได้ว่ามีอยู่ เราจึงจงใจป้อนเคสที่ต้องถูกปฏิเสธเข้าไปทีละแบบ แล้วดูรหัสจบงานที่มันคืนออกมา
| ป้อนอะไรเข้าไป | ต้องได้อะไร | รหัสจบงาน |
|---|---|---|
| คนทำกับคนตรวจ เป็นโมเดลเดียวกัน | ปฏิเสธ ไม่รันรีวิวเลย | 4 |
| คนทำกับคนตรวจ คนละค่าย | ผ่าน รันรีวิวตามปกติ | 0 |
| ไม่บอกว่าคนทำคือโมเดลอะไร | ปฏิเสธ ไม่เดาให้ | 1 |
| ชื่อโมเดลที่ไม่รู้จัก | ปฏิเสธ พร้อมบอกเหตุผล | 2 |
แถวแรกคือแถวที่มีค่าที่สุด ไม่ใช่เพราะมันขึ้นเขียว (ผ่าน) เฉยๆ แต่เพราะเราสั่งให้มันขึ้นแดงแล้วมันขึ้นแดงจริง ก่อนหน้านั้นถ้าใครถามว่ากติกาข้อนี้ทำงานไหม คำตอบที่ซื่อสัตย์ที่สุดคือ "ไม่รู้"
ช่วงที่ 4สองจุดที่หลอกเรา ตอนต่อของจริง
หนึ่ง จบด้วยรหัสศูนย์ ไม่ได้แปลว่าตรวจแล้ว
29 กรกฎาคม เรารันตัวตรวจบนเครื่อง Mac กับงานชิ้นหนึ่ง ได้ผลว่าเรียบร้อย รหัสจบงานเป็นศูนย์ ไฟล์รายงานถูกสร้างขึ้นมาจริง ถ้าหยุดแค่ตรงนั้นเราจะสรุปว่า "ตรวจแล้ว ไม่เจออะไร" และนั่นเป็นคำพูดที่ไม่จริงเลย
พอเปิดไฟล์รายงานอ่าน ข้างในมีแต่ข้อความว่าเข้าใช้ไม่ได้ สิทธิ์เข้าใช้บนเครื่องนั้นถูกเพิกถอนไปแล้ว ตัวโปรแกรมวนขอสิทธิ์จนยอมแพ้ แล้วจบงานด้วยรหัสศูนย์อยู่ดี ไฟล์รายงานที่ได้มีขนาดราวหกร้อยไบต์ เป็นเบาะแสเดียวที่มองเห็นจากข้างนอก
พอย้ายไปรันบนเครื่องที่สิทธิ์ยังใช้ได้ งานชิ้นเดียวกันได้ปัญหากลับมาสี่ข้อ และหนึ่งในนั้นคือคำขอที่ส่งข้อมูลว่างเข้าไปแล้วทำให้เซิร์ฟเวอร์ตอบข้อผิดพลาด ทำซ้ำบนของจริงได้ทันที ถ้าเชื่อรหัสศูนย์ตอนนั้น ปัญหานั้นก็ได้ขึ้นระบบไปแล้ว
อ่านผลงานที่มันทำ อย่าอ่านแค่ว่ามันไม่บ่น เราเลยเปลี่ยนวิธีสรุปผลเป็นการเปิดไฟล์รายงานแล้วมองหาบรรทัดที่เป็นข้อสรุปของตัวตรวจจริงๆ การไม่มีบรรทัดปัญหา ไม่เท่ากับผ่าน มันอาจแปลว่ามันไม่เคยได้เริ่มตรวจ
สอง รุ่นที่แรงที่สุด มาพร้อมค่าตั้งต้นที่อ่อนที่สุด
ตอนตั้งเลนตรวจ เราอยากใช้รุ่นที่ดีที่สุดของ Codex ก็เลยไปเปิดดูว่ารุ่นไหนคือรุ่นไหน ตารางรายชื่อรุ่นฝังอยู่ในตัวโปรแกรมเอง และมันบอกเรื่องที่ไม่คาดคิด
รุ่นเรือธงที่อธิบายตัวเองว่าเป็นรุ่นที่เก่งที่สุด ตั้งค่าความพยายามคิดเริ่มต้นไว้ที่ ระดับต่ำ ในขณะที่รุ่นรองที่บอกว่าเอาไว้ใช้งานประจำวัน ตั้งไว้ที่ระดับกลาง แปลว่า เรียกตัวที่แรงที่สุดเฉยๆ จะได้ผลที่คิดน้อยกว่าเรียกตัวที่อ่อนกว่า
มันไม่ใช่ความผิดพลาด คำอธิบายของรุ่นนั้นบอกเองว่าออกแบบมาให้เก่งตั้งแต่คิดน้อย แล้วให้ผู้ใช้ค่อยดันขึ้นเมื่อเจองานยาก แต่ผลที่ตามมาสำหรับคนที่ไม่ได้อ่านตรงนั้นคือ การอัปเกรดที่กลายเป็นการถอย
เรื่องที่ซ้อนอยู่ในนั้นอีกชั้น คือตอนสั่งด้วยชื่อรุ่นที่พิมพ์ผิด โปรแกรมไม่ฟ้อง มันพิมพ์ชื่อที่เราพิมพ์ผิดออกมาแล้วเดินต่อ กว่าจะรู้ว่าไม่มีรุ่นนั้นก็ไปพังทีหลัง หรือแย่กว่านั้นคือเงียบไปเลย หลักฐานว่ารุ่นที่รันคือรุ่นที่สั่ง จึงต้องมาจากบันทึกการทำงานฝั่งผู้ให้บริการ ไม่ใช่จากการที่ไม่มีข้อความแดงขึ้นมา
กฎที่ได้จากสองข้อนี้สั้นมาก ตั้งรุ่นใหม่เมื่อไหร่ ตั้งระดับความพยายามคิดไปพร้อมกันเสมอ และเลนที่ต้องการคุณภาพสูงสุดอย่างเลนตรวจ ห้ามปล่อยให้ตกไปที่ค่าตั้งต้นของบัญชี เพราะค่าที่เราไม่ได้ระบุ คือค่าที่ผู้ให้บริการเปลี่ยนได้ทุกเมื่อโดยไม่ต้องบอกเรา
ช่วงที่ 5สรุป แล้วควรใช้ตัวไหน
ตอบตรงตามสถานการณ์ ไม่มีคำตอบเดียว
| สถานการณ์ของคุณ | ทำแบบนี้ |
|---|---|
| จ่ายได้ตัวเดียว ทำงานคนเดียว | เลือกตัวที่เข้ากับที่ทำงานคุณดีกว่า แล้วอย่าให้มันรีวิวงานตัวเองปิดท้าย ให้คนอ่าน diff เอง |
| มีทั้งสองตัวอยู่แล้ว | ตัวที่คุณคุ้นมือที่สุดเป็นคนเขียน อีกค่ายเป็นคนตรวจก่อน merge และอย่าสลับบทบาทตามอารมณ์ในแต่ละวัน |
| ทำงานเป็นทีม หรือมีสคริปต์ | เขียนกติกาลงสคริปต์ ให้มันปฏิเสธเองเมื่อคนเขียนกับคนตรวจชนกัน ความจำของคนใช้ไม่ได้ในทีม |
| งบจำกัด เลือกได้ทางเดียว | ลงที่เลนตรวจ ไม่ใช่เลนเขียน รุ่นถูกลงหน่อยตอนเขียนพอไหว แต่ตัวตรวจที่คิดน้อยคือตัวตรวจที่ไม่เจออะไร |
เริ่มพรุ่งนี้ได้เลยสามขั้น
- หยิบงานล่าสุดที่ AI เขียนให้ แล้วส่งให้ AI อีกค่ายหนึ่งอ่าน diff เดียวกัน นับดูว่ามันเจออะไรที่รอบแรกไม่เจอกี่ข้อ ตัวเลขนั้นคือคำตอบว่าเรื่องนี้คุ้มกับงานคุณไหม
- เปิดไฟล์รายงานที่ตัวตรวจสร้าง อ่านข้างในจริงๆ หนึ่งครั้ง อย่าเชื่อแค่ว่ามันจบงานเรียบร้อย
- ไปดูว่าเลนตรวจของคุณระบุรุ่นและระดับความพยายามคิดไว้ครบหรือยัง อันไหนที่ไม่ได้ระบุ คืออันที่คนอื่นกำหนดให้คุณ
ข้อเดียวที่อยากให้จำ
ถ้าจำได้ข้อเดียวจากบทความนี้ ขอให้เป็นข้อนี้ กฎที่เขียนว่าต้องหรือห้ามไว้ในเอกสาร ให้ถามทันทีว่าตอนนี้ถ้าใครทำตรงข้าม อะไรจะหยุดเขา ถ้าคำตอบคือความจำของคน กฎนั้นยังไม่ได้บังคับ
เรื่อง Codex กับ Claude Code เป็นแค่ตัวอย่างที่จับต้องได้ที่สุดของกฎข้อนี้ พรุ่งนี้ชื่อรุ่นจะเปลี่ยน อันดับในตารางเปรียบเทียบจะสลับ แต่คำถามว่าใครเซ็นผ่านงานใคร และมีอะไรกันไว้จริงหรือเปล่า จะยังเป็นคำถามเดิม
ถ้าอยากอ่านต่อว่าทำไมตัวที่เขียนงานถึงมองไม่เห็นบั๊กของตัวเอง เราเล่าไว้ละเอียดกว่านี้ที่ ให้ Codex รีวิวโค้ดที่ Claude Code เขียน และถ้าสนใจว่าตัวตรวจที่รายงานว่าผ่านทั้งที่ไม่ได้ตรวจ หน้าตาเป็นยังไงอีกบ้าง ลองอ่าน เมื่อตัวตรวจบอกว่าผ่าน ทั้งที่ยังไม่ได้ตรวจ
- กติกาเรื่องคนตรวจต้องคนละโมเดลกับคนทำ เขียนไว้ในเอกสารกติกาของระบบเราตั้งแต่ 5 ก.ค. 2026 ส่วนตัวคั่นกลางที่บังคับกติกานั้นเขียนและทดสอบเมื่อ 11 ส.ค. 2026 ตารางรหัสจบงานมาจากการรันเคสจริงทั้งสี่แบบ
- สามข้อที่ตัวตรวจคนละค่ายเจอเพิ่มในรอบที่สาม มาจากรายงานการตรวจของเราเอง 11 ส.ค. 2026
- กรณีจบด้วยรหัสศูนย์ทั้งที่ไม่ได้ตรวจ และปัญหาสี่ข้อที่ได้กลับมาหลังย้ายเครื่อง เจอเองเมื่อ 29 ก.ค. 2026
- ค่าความพยายามคิดเริ่มต้นของแต่ละรุ่น อ่านจากตารางรายชื่อรุ่นในตัวโปรแกรม Codex CLI แล้วยืนยันกับบันทึกการทำงานของรอบที่รันจริง 11 ส.ค. 2026
- เอกสารทางการของเครื่องมือทั้งสอง Codex CLI และ Claude Code