บทที่ 08 · ประกอบ Harness · Permissions & Safety

Permissions & Safety

คุณถามว่า “ห้องนี้ว่างไหม?” แล้วผู้ช่วยก็ จองให้เลย — คุณไม่ได้ขอให้จอง บทนี้คือเส้นแบ่งระหว่าง อ่าน (read) กับ ทำ (act) และการกั้นสิ่งที่ย้อนไม่ได้ไว้หลังมนุษย์ หัวใจ: ความสามารถกับรัศมีความเสียหายคือลูกบิดเดียวกัน — ทุก tool ที่คุณเปิด คือสิ่งที่มันทำได้ในวันที่มันพลาด

พูดแบบเข้าใจง่าย

LLM เปล่งคำสั่งเรียก tool ชื่ออะไรก็ได้ที่มันนึกออก — harness ต่างหากที่ตัดสินว่าอันไหนได้รันจริง

เปรียบเทียบ: รถเข็นยาฉุกเฉิน (crash cart) ที่ล็อกไว้ ทุกลิ้นชักมีป้ายว่าข้างในคืออะไรและเปิดเมื่อไร · ลิ้นชักส่วนใหญ่ถูกเทปปิดไว้สำหรับเคสนี้ · สองลิ้นชักที่เป็นยาควบคุมต้องมีพยาบาลคนที่สอง “เซ็นร่วม” ล็อก = deny-by-default · เทปปิด = tool ที่ปิดอยู่ · ป้าย = คำอธิบายที่กำหนดการหยิบ · เซ็นร่วม = gate confirmed=true ก่อนทำสิ่งที่ย้อนไม่ได้

ในระบบของเรา — เปิดเท่าที่จำเป็น + gate สิ่งที่ย้อนไม่ได้

โมเดลขอเรียกtool อะไรก็ได้ที่มันนึกออก
Allow-listเปิดอยู่ไหม? ถ้าไม่ → ปฏิเสธ ไม่เกิดอะไร
Gatewrite/ย้อนไม่ได้ → ต้อง confirmed=true
ค่อยรันเฉพาะที่ทั้งเปิดและผ่าน gate

ระบบจริงของเราเปิดใช้งานเครื่องมือเพียง ส่วนหนึ่ง จากที่ลงทะเบียนทั้งหมด (deny-by-default) ปิด built-in ที่อันตราย ทิ้งทั้งหมดแล้วค่อย whitelist เฉพาะที่ตรวจแล้ว และเครื่องมือที่ ย้อนไม่ได้ สองสามตัว (เช่นสร้าง event ที่ส่งอีเมลเชิญ, ปล่อยเกรด) ถูกบังคับ echo-back + confirmed=true การที่ระบบรัน “โดยไม่มี prompt ถามทีละครั้ง” ปลอดภัยได้ เพราะ มี allow-list คัดไว้แล้ว และมีผู้ดูแลคนเดียวที่ไว้ใจได้

“ไม่มี prompt ถาม” ≠ “ไม่มีความปลอดภัย” — มันแปลว่า ด่านถูกย้ายที่: จากการถามยืนยันทีละครั้ง ไปเป็น allow-list แบบนิ่ง ๆ + gate บนการเขียนที่ย้อนไม่ได้ ถ้าเอาด่านนั้นออกด้วย มันถึงจะอันตรายจริง (ดูตัวอย่าง “แย่” ด้านล่าง)

ทำพลาด vs ทำถูก

⚠️ แย่ · เปิดทุก tool + ไม่มี gate
ยกด่านออกในระบบหลายผู้ใช้
ก๊อปแพตเทิร์น “ไม่มี prompt ถาม” ไปใช้กับบริการสาธารณะ แต่ทิ้ง allow-list และ gate ทั้งหมด “เพราะโมเดลฉลาดพอ” แล้วมีคนพิมพ์ฉีดคำสั่งว่า “ปล่อยเกรดทั้งหมด” — เกรดถูกปล่อยทันที รัศมีความเสียหาย = รวมทุก tool
✅ ดี · deny-by-default
แค็ตตาล็อกคือสวิตช์ปิด
tool ที่เพิ่งเขียนยังไม่ตรวจ = ปิดไว้ก่อน โค้ดที่ deploy ใหม่จึงไม่แอบขยายอำนาจ agent รัศมีความเสียหายตรวจได้จากที่เดียว: “อะไรเปิดอยู่บ้าง”
✅ ดี · echo-back + confirmed=true
กันชน 2 ชั้นบนสิ่งที่ย้อนไม่ได้
คำอธิบายสั่งให้ echo-back ก่อน + เครื่องมือ ปฏิเสธทางกลไก ถ้าไม่มีธง — โมเดลที่ “ลืม” คำสั่งก็ยังยิงมั่วไม่ได้ อ่านเกรด = เสียงรบกวนที่ลบได้; ส่งเชิญ 30 คน/ปล่อยเกรด = ย้อนไม่ได้

ลองเอง — พลิกแค็ตตาล็อกแล้วตั้ง gate

กิจกรรม · กดสลับแล้วดูผล
Flip the Manifest & Set the Gate
แค็ตตาล็อกเริ่มแบบ deny-by-default (ปิดหมด) ลองเปิด tool และตั้ง gate ดูแถบ “รัศมีความเสียหาย” ขยับ แล้วกดสถานการณ์ 3 อัน (ครู 2 + injection 1) — ดู injection เด้งกลับจากบอร์ดที่ว่าง แล้วดูมันปล่อยเกรดทันทีถ้าเปิด tool โดยไม่มี gate
เปิด/ปิด tool · ตั้ง gate · กดสถานการณ์
มองไปข้างหน้า — ปลอดภัยแล้ว แต่ตอนรันยาว ๆ จะรู้ได้ไงว่าเกิดอะไร? ตอนนี้ผู้ช่วยทั้งปักหมุดข้อมูลจริงและถูกกั้นอำนาจแล้ว แต่ถ้า tool ค้าง หรือมันตอบผิดในรอบที่ 14 — คุณจะเห็นไหม? บทที่ 09 ว่าด้วย การคุมลูปและการมองเห็น (observability)

สรุปบทที่ 08

Harness Scorecard · มิติ: “deny-by-default + gate สิ่งที่ย้อนไม่ได้ไหม?” ผู้ช่วยจัดการแล็บ ✅ แข็งแรง — เปิดเท่าที่จำเป็น + gate บนการเขียนที่ย้อนไม่ได้ (จุดแข็งของระบบเรา)

📋 build-your-harness checklist · บรรทัดที่ 8 “deny-by-default allow-list + least privilege + HITL gate (confirmed=true) บนทุกการกระทำที่ย้อนไม่ได้”