# S6-D · สัญญาข้อมูลและการทดสอบข้อไม่รู้

**ก่อนเริ่ม:** อ่าน M08/M10, schema CSV, time offset, versioning และการทดสอบ expected/actual. KSEC: `APP-CSW-D-K01/S01/E01/C01`; [rubric](rubric.md)

ออกแบบ contract 18 fields. คีย์เหตุการณ์คือ `(scenario_id, record_id, revision)` และต้องเก็บ `source_row` ใน output เพื่อผูก expected; `unknown`, `none`, `training_only`, visibility และ version เป็นค่าคนละความหมาย. Output มี `source_row/current_or_history/expected_status/reason/next_check/rule_version/decision_time`; ไม่มี `safe`, `confirmed_fire`, `evacuate` หรือ `flight_authorized`

เขียน expected ก่อนรัน 16 แถว จากนั้นทดสอบ baseline + mutation: HOT-A รุ่นกลับลำดับ, HOT-B เวลาเก่าหรือ offset หาย, OPT-B visibility เปลี่ยนโดยไม่มีแหล่งใหม่, WX-A/AIR-A/PERM-A unknown, MSG-W sent แต่ ACK-W ว่าง, rights ไม่ใช่ training_only และ source_row ซ้ำ. กฎต้องกักข้อมูลผิด/ไม่ครบพร้อมเหตุ ไม่เติมค่าที่หาย. เก็บ hash input/source, เวลา คำสั่ง exit/raw/diff ที่รันเอง; แยกผลผู้เขียน. คืน baseline แล้ว rerun และบันทึก discrepancy. ถ้าไม่รัน actual ให้ `APP-CSW-D-S01 = NOT_RUN`

ทำ D-v0 → review log ≥2 issue → D-v1 พร้อม owner, rollback trigger, retest result จริงหรือ NOT_RUN. ไม่มีฮาร์ดแวร์บิน/ไฟจริงในกิจกรรมนี้
