/investigate
/investigate <ปัญหาหรือการตัดสินใจ> [--compare]ใช้ขั้นนี้เมื่อคุณยังรู้ไม่พอที่จะเขียนข้อตกลงที่เชื่อถือได้เท่านั้น มันเป็นขั้นเดียวในวงจรที่เป็นตัวเลือก และการหยิบมาใช้โดยอัตโนมัติมีแต่จะเพิ่มเวลา
เหตุผลที่ควรใช้จริง ๆ
- ยังไม่รู้ต้นตอของปัญหา
- มีหลายแนวทางที่ tradeoff ต่างกันอย่างมีนัยสำคัญ
- ข้อจำกัดเรื่อง compatibility หรือ migration ยังไม่ชัด
- เป็นเส้นทางโค้ด brownfield ที่ไม่คุ้นเคย
- เป็น external API ที่ยังไม่ได้อ่านเอกสารตาม version, success path หรือ failure behavior
เริ่มจากสิ่งที่ยังไม่รู้
หัวข้อที่มีชื่อว่า “เริ่มจากสิ่งที่ยังไม่รู้”เขียน input เป็นการตัดสินใจที่คุณตัดไม่ลง ไม่ใช่คำสั่งให้ไป implement อะไร
/investigate why profile updates occasionally overwrite newer dataถ้าเป็น change ที่มีอยู่แล้ว ให้ใส่ ID พร้อมคำถามใหม่
/investigate add-profile: should updates use last-write-wins or optimistic locking?ได้อะไรกลับมา
หัวข้อที่มีชื่อว่า “ได้อะไรกลับมา”agent จะอ่านโค้ดที่เกี่ยวข้องแล้วแยกผลลัพธ์ออกเป็น
- ข้อเท็จจริงที่ยืนยันจากโค้ดจริง
- สมมติฐาน ที่ยังไม่ได้พิสูจน์
- ข้อจำกัด และขอบเขตที่ได้รับผลกระทบ
- ตัวเลือก พร้อม tradeoff
- สิ่งที่ยังไม่รู้ ซึ่งต้องให้คุณตัดสินใจ
การแยกนี้คือคุณค่าทั้งหมดของขั้นนี้ เพราะสิ่งที่นำเสนอเป็นข้อเท็จจริงกับสิ่งที่เป็นแค่การเดา นำไปสู่ change ที่ต่างกันมาก และการยุบสองอย่างนี้รวมกันคือวิธีที่ข้อตกลงห่วย ๆ เกิดขึ้น
มันจะจบด้วยหนึ่งในสามอย่างนี้เท่านั้น
ready for /changeneeds user decisionnot worth changingnot worth changing เป็นผลลัพธ์ที่ถูกต้องและมีประโยชน์
เขียนอะไรได้บ้าง
หัวข้อที่มีชื่อว่า “เขียนอะไรได้บ้าง”ขั้นสำรวจเป็น read-only ต่อโค้ดของโปรดักต์และ OpenSpec สิ่งเดียวที่เขียนได้คือบันทึกการสำรวจที่ openspec/investigations/<name>.md และเขียนก็ต่อเมื่อผลการสำรวจต้องคงอยู่จริง ๆ
โหมดเปรียบเทียบ
หัวข้อที่มีชื่อว่า “โหมดเปรียบเทียบ”สำหรับทางเลือกด้าน experience, API หรือสถาปัตยกรรมที่ยังตัดสินไม่ได้จริง ๆ ให้เติม --compare
/investigate dashboard filter interaction --compareจะได้ทางเลือกแบบเบาและใช้แล้วทิ้ง 3–5 แบบใต้ .foundation/prototypes/<id>/ ในโหมดนี้ agent เขียนได้ เฉพาะ ในไดเรกทอรี prototype เท่านั้น ไม่แตะโค้ดโปรดักต์ ไม่แตะ OpenSpec และไม่เพิ่ม lifecycle state ใด ๆ
มันจะเขียน selection.md เสมอ เพื่อบันทึกตัวเลือกที่เลือก เหตุผล ทางเลือกที่ตัดทิ้ง และ path ของ artifact และเมื่อหลักฐานตัดสินไม่ได้ มันจะถามคุณแทนที่จะเลือกเอง
ไปต่อที่ข้อตกลงพร้อมแนบตัวเลือกที่เลือกไว้
/change <intent> --prototype-selection <selection-path>/change จะสรุปการตัดสินใจนั้นลงใน proposal และ design แต่จะไม่ถือว่าตัวเลือกหรือ artifact ของมันเป็นหลักฐาน
สำหรับ integration บันทึกจะเก็บ source กับ version ของเอกสารให้ชัด /change
จึงบังคับ scenario ทั้ง success และ failure ส่วน API ที่ยังไม่อ่านหรือไม่มี version
เป็น research boundary ไม่ใช่ contract ที่เดาได้