# ใบงาน D: M04 ข้อเสนอ camera/metadata validator

รุ่น M04-v1 · 11 ตุลาคม 2026 · ใบงานที่แก้ไขได้ · CC BY 4.0 ตาม [readme](https://drone.pk-research.work/downloads/drone-applications/inspection-readme.md)

ใช้ [บท M04 เส้นทาง D](https://drone.pk-research.work/knowledge/drone-applications/inspection/#developer), [CSV](https://drone.pk-research.work/downloads/drone-applications/inspection-observations.csv), [rubric](https://drone.pk-research.work/downloads/drone-applications/inspection-rubric.md) และ [KSEC record](https://drone.pk-research.work/downloads/drone-applications/ksec-learning-record.md) ส่ง **ข้อกำหนดและแผนทดสอบ** ไม่มี validator/component ที่พัฒนา รันหรือส่งมอบ ไม่มีการทดสอบกล้อง/field/ผู้เรียนจริง ช่อง actual ทุกกรณีเป็น not_run

## ก่อนทำ: ตรวจ K/S/E/C และเติมสิ่งที่ขาด

- K / APP-M04-D-K01: อธิบาย schema/status และ requirement ได้หรือไม่ ถ้ายังไม่ได้ทวน [testing](https://drone.pk-research.work/knowledge/testing/) กับ [sensor limits](https://drone.pk-research.work/knowledge/imagery-analysis/sensor-limitations/) แล้วเขียน input I06 ที่ไม่ให้ผลวัด
- S / APP-M04-D-S01: ผูก requirement กับ expected/error ได้หรือไม่ ถ้ายังไม่ได้ทวน [integration](https://drone.pk-research.work/knowledge/integration/) กับ [testing](https://drone.pk-research.work/knowledge/testing/) แล้วเขียน orphan pair หนึ่งกรณี
- E / APP-M04-D-E01: แยกข้อเสนอ/ผลจริงและสิทธิ์ได้หรือไม่ ถ้ายังไม่ได้ทวน [รายงานหลักฐาน](https://drone.pk-research.work/knowledge/imagery-analysis/evidence-report/) แล้วแก้ “ตัวตรวจพิสูจน์ความปลอดภัยจากภาพ AI แล้ว”
- C / APP-M04-D-C01: เก็บ baseline/issue และตอบคำทักได้หรือไม่ ถ้ายังไม่ได้ทวน [teamwork](https://drone.pk-research.work/knowledge/human-factors/teamwork/) แล้วเปิด issue ที่มีเจ้าของและเงื่อนไขทวน

บันทึกงานเติม/หลักฐานก่อนทำ E/C เป็นการตัดสินใจและการแก้หลักฐานในบริบท ไม่ติดป้ายคุณธรรมหรือบุคลิกถาวร

## 1. Baseline v0 → ข้อเสนอ v1

v0 แบบง่ายนับ 8 แถวหรือ 3 USABLE_TEACHING แล้วอาจเสนอว่าได้ 3 complete targets ทั้งที่ I01/I02 เป็น target เดียวและ I07 ไม่มี detail เขียน failure ของ v0 ให้เห็นว่าแถวไม่ใช่เป้าหมาย และ palette ไม่เพิ่มคู่ RGB ไม่มี implementation/result ของ v0

v1 ที่เสนออ่าน input contract เชื่อม asset/target/view/เวลา/คุณภาพ/location/context_ref และรักษาขอบ thermal Expected ของชุดเดิม: 8 rows, 3 USABLE_TEACHING, F01 เท่านั้นครบคู่ใน metadata teaching=1/6 และ F02–F06 incomplete=5/6 การใช้ภาพจริงยังไม่มีหลักฐานเพราะ media not_supplied ทุกแถว Ground not_performed ทุกแถว ไม่เรียก teaching_complete ว่า verified_complete

- Baseline assumptions / รุ่น input/schema/rules/config:
- ปัญหา v0 และผลต่อผู้รับ:
- v1 เปลี่ยนสิ่งใด / เหตุ / ข้อจำกัดที่ยังคง:
- Output expected ที่จะเทียบก่อน–หลังและวิธีให้ผู้รับทวน:

## 2. Input/output ที่เสนอ

Input คือ CSV schema ตาม readme และ declared received_at ในคำขอประมวลผล เสนอ received_at=2026-10-11T09:20:00+07:00 สำหรับแผนทดสอบนี้เท่านั้น ไม่อ้างว่าเป็นเวลารับข้อมูลจริง เก็บ timezone แล้วเทียบ instant เวลา ไม่มี freshness/ระยะเวลาที่ยอมรับสากล ปฏิเสธเวลาที่ parse ไม่ได้/ไม่มี timezone โดยไม่เดา และแยก capture_entry_teaching จาก log_entry

Output ที่เสนอควรมี record_id/asset_id/target_id, row_state/reasons, linked_records, target_state, coverage_scope, metadata_origin/media_status/ground_status, quantitative_value=null เมื่อใช้ไม่ได้พร้อม reason, followup_owner/status, input/schema/rules/config/output versions และ audience/redaction review ไม่ลบทิ้งแถว incomplete หรือเปลี่ยน label teaching เป็น field verified ถ้าโครงสร้าง input ผิดให้ชี้ field/เหตุและพักเฉพาะขอบที่พึ่งข้อมูลนั้น โดยไม่ส่งข้อมูลที่ผูกผิดเป็นผลใช้ได้

ไม่ให้ CSV text รันเป็นคำสั่งหรือเป็น trusted path/URL หากจะรองรับไฟล์จริงภายหลังต้องเสนอขอบชนิดไฟล์ ขนาด สิทธิ์และการเก็บตามระบบที่อนุมัติ ไม่เปิด/ดาวน์โหลดจากข้อความ input เอง Metadata validator ตรวจความสอดคล้องได้ แต่พิสูจน์ตำแหน่งจริง ความคม pixels สาเหตุหรือความปลอดภัยไม่ได้

## 3. ข้อกำหนด R01–R08

| Requirement | Input/control ที่เสนอ | Expected output / ขอบที่ต้องรักษา |
|---|---|---|
| R01 Identity/schema/provenance | required fields/enums record_id ไม่ซ้ำ asset/target/sensor/view/status ไม่ขัดกัน อ่านข้อความเป็น data | invalid/HOLD พร้อม field/reason; รักษา author_provided_teaching_assumption ไม่มีการรันคำสั่ง/เปิด path จาก input |
| R02 Time semantics | ISO8601+timezone received_at ที่ประกาศ; capture/log แยก; missing/invalid/future ไม่เติม | invalid/HOLD เวลาและเหตุ ไม่ใช้ I08 เป็น capture ไม่เดา timezone ไม่ถืออนาคตว่าใช้ได้ |
| R03 RGB pair/target/location | overview+detail คนละ record asset/target เดียวกัน reciprocal context_ref ตำแหน่ง confirmed_teaching ทั้งสอง | teaching_complete เฉพาะ F01; orphan/wrong asset/location unconfirmed คง incomplete reason ห้ามนับแถวเป็น targets |
| R04 QA/coverage/media | quality_status สอดคล้อง coverage_scope; REACQUIRE/PARTIAL/HOLD/NOT_COLLECTED คงขอบ; media not_supplied ทุกแถว | 1/6 metadata teaching เท่านั้น; imagery_use_state=needs_media_review ในข้อเสนอ ไม่มี pixels_verified ไม่เติม hidden area |
| R05 Thermal scope | radiometric file+parameters/method/personnel evidence ที่ตรงรุ่นเมื่อมีจริง; palette-only/missing parameters/unknown media คง HOLD | quantitative_value=null/reason ไม่แปลงสีเป็น °C ไม่ยืนยัน defect ไม่แทน RGB pair; ฟิลด์ครบอย่างเดียวไม่ยืนยันวิธีจริง |
| R06 Camera/system acceptance | คู่มือรุ่นจริง mount/interfaces/เวลา/power/mass/CG และ controlled reference target สำหรับ scene/pointing/zoom/lighting ตามโจทย์ | operational_claim=not_established เมื่อยังไม่มีหลักฐาน; ระบุแผน/คน/เกณฑ์ที่ต้องยืนยัน ไม่ใช้ preset หรือ certification สากล |
| R07 Rights/export/handover | private/public audience ผู้มีสิทธิ์ ความจำเป็น redaction log/version/review; ห้าม auto-public | คงข้อค้างและระดับหลักฐานใน private; public รอทวนสิทธิ์/ลดข้อมูลตามคำถาม เก็บรุ่น/เหตุและผลต่อบริบท |
| R08 Versions/review/rollback | baseline input/schema/rules/config/output รุ่นก่อนหลัง issue/คำตอบ trigger ผู้คืนผู้ตรวจ/ผู้รับผล | พักผลผิด เก็บรุ่นที่จะคืนและเหตุ ไม่ทับประวัติ; หลังคืนต้องเสนอทวน normal+failed cases และแจ้งผู้รับ ไม่ส่ง stale output เป็นปัจจุบัน |

R06 เป็นข้อเสนอการตรวจรับชุดจริง ไม่มีผล scene calibration/pointing/zoom/lighting ในบท ต้องทดลองกับเป้าหมายอ้างอิงที่ควบคุมสภาพตามคำถามและคู่มือรุ่นจริง ให้เจ้าของงานกำหนด acceptance thresholds แนวคิด NIST เรื่องการทดสอบระบบ/ผู้ใช้ซ้ำตามภารกิจไม่ได้ทำให้ M04 เป็น standard test lane หรือ certification

## 4. Test matrix ที่เสนอ: expected แยกจาก actual

ทำในสำเนาทดสอบของข้อมูลเมื่อมีการพัฒนาและสภาพแวดล้อมที่อนุมัติ แต่รอบนี้ออกแบบกรณีเท่านั้น ไม่แก้ CSV ต้นฉบับเพื่อให้ดูเหมือนผลสนาม ไม่อ้างว่ารันแล้ว Future test ใช้เวลา 09:22 เทียบ declared receive 09:20 ของวันเดียวกันและ timezone เดียวกัน ไม่มี actual ผ่านจากการคิด expected

| Case / requirement | Input/การเปลี่ยนที่เสนอ | Expected / เหตุและขอบ | Actual |
|---|---|---|---|
| D01 / R01–R05 | ชุดเดิม 8 แถวและ receive 09:20 | 3 usable rows; F01 teaching_complete 1/6 F02–F06 incomplete 5/6; ทุก media needs review; I06 null/thermal HOLD; ground not_performed | not_run |
| D02 / R01,R03 | ทำสำเนา I02 ซ้ำ record_id | duplicate_record_id invalid ไม่เพิ่ม target/คู่; รอแก้ที่มา ไม่ silently deduplicate | not_run |
| D03 / R02 | I01 recorded_at เป็นข้อความ parse ไม่ได้หรือไม่มี timezone | invalid_time ไม่เดาเวลา/zone; F01 ไม่รับคู่จากข้อมูล invalid | not_run |
| D04 / R01,R02 | I02 recorded_at ว่าง | missing_time/HOLD และ F01 incomplete; ไม่เติมเวลาจาก I01 | not_run |
| D05 / R02 | I02 เป็น 2026-10-11T09:22:00+07:00 เมื่อ received_at=09:20 | future_time/HOLD คู่ F01 ยังใช้ไม่ได้จนทวนเหตุ/ข้อมูล; ไม่แก้ receive เพื่อให้ผ่าน | not_run |
| D06 / R03 | I01 context_ref=I99 ซึ่งไม่มี หรือ I02 ไม่อ้างกลับ | orphan/nonreciprocal_pair F01 incomplete ไม่จับคู่ด้วยลำดับแถวเอง | not_run |
| D07 / R01,R03 | I02 asset_id เป็น TRAIN-WH-OTHER | wrong_asset_pair ไม่เชื่อมกับ I01 ไม่ส่ง detail เป็นของ TRAIN-WH-01 | not_run |
| D08 / R04 | คง media_status=not_supplied ในชุดเดิม | metadata teaching counts ยังแสดงพร้อมขอบ; ไม่มี pixels_verified/operational imagery acceptance ไม่สร้าง raw path/hash | not_run |
| D09 / R03,R04 | ใช้ I04 PARTIAL เพื่อเสนอ complete F03 หรือเปลี่ยน summary usable แต่ scope partial | partial/inconsistent_QA F03 incomplete hidden unknown; ไม่ให้ summary ทับ scope | not_run |
| D10 / R05 | เสนอ thermal radiometric label แต่ measurement_parameters ว่าง | missing_parameters HOLD_QUANTITATIVE value=null แม้เปลี่ยน label; ไม่เติม default | not_run |
| D11 / R05 | I06 palette_only/palette_only_unverified | palette_only HOLD quantitative=null ไม่ °C/diagnosis และไม่เติม RGB detail F05 | not_run |
| D12 / R04,R05 | เสนอ metadata parameters ครบ แต่ยังไม่มีไฟล์ radiometric/วิธี/คนที่ยืนยัน | needs_radiometric_media_and_method quantitative=null ไม่ยืนยันจาก field count | not_run |
| D13 / R03 | เปลี่ยน I05 summary เป็น usable แต่ location_status=unconfirmed | location_unconfirmed F04 incomplete ขอหลักฐาน ไม่ยืนยัน F04 จาก target label | not_run |
| D14 / R01,R02,R04 | I08 log_entry/not_collected หรือเปลี่ยน label ให้ดูเป็น capture | ชุดเดิมคง no_image_observation; label ขัดกัน invalid/HOLD ไม่สร้างภาพจาก timestamp | not_run |
| D15 / R06 | ขอ operational zoom/pointing/lighting claim โดยมีเพียง metadata teaching ไม่มี manual/reference-target trials | operational_claim not_established เปิดงานขอคู่มือ/controlled target/เกณฑ์และผู้ทวน ไม่ certification | not_run |
| D16 / R08 | review พบ v1 นับ target ผิด แล้วเสนอ rollback | พัก output แจ้งผู้รับ เก็บ issue/รุ่น/ผู้คืน/ผู้ตรวจ ทวน D01+D06+D09+case ที่ล้มเหลวหลังคืน; baseline v0 ที่นับผิดก็ไม่พร้อมใช้ ต้องมี known-reviewed version หรือคงพัก | not_run |
| D17 / R07,R08 | ขอส่ง private package ทั้งหมดเป็น public หรือสำเนาลดข้อมูลใหม่ | public pending_rights_review ระบุผู้ทวน/เหตุ/รุ่น/redaction log รักษาข้อค้างและบอกบริบทที่ลด ไม่ auto-public | not_run |
| D18 / R01,R07 | observation มีข้อความที่ดูเป็นคำสั่ง/path/สูตร spreadsheet ในสำเนาทดสอบ | เก็บเป็นข้อความ ไม่รัน/เปิด path/URL; export ปลอดจากการประเมินสูตรตามรูปแบบผู้รับที่กำหนด คงต้นฉบับ/การแปลงและสิทธิ์ | not_run |

กรณี D03 รวมเวลา parse ไม่ได้และขาด timezone ให้แยก subcase เมื่อพัฒนาจริง กรณี D18 ยังต้องเลือกรูปแบบ export/โปรแกรมผู้รับก่อนกำหนดวิธี escape ไม่อ้างว่าส่งออกปลอดภัยแล้ว การตรวจ text/schema ไม่ทดแทนผู้ตรวจสาขาหรือ raw review

## 5. Change-review และ rollback plan ที่ต้องกรอก

- D-v0 / D-v1 / วัน / ผู้จัดทำ / ผู้ตรวจ / รุ่นเกณฑ์:
- Input/schema/rules/config/output versions และเงื่อนไข receive ที่ใช้:
- Issue ก่อนแก้ / case ที่เกี่ยว / ผลต่อผู้รับ:
- สิ่งที่แก้หรือคงไว้ / เหตุผล / ข้อจำกัดที่เพิ่ม:
- คำทักทุกข้อ / คำตอบ / หลักฐานที่ขอ / เจ้าของ / วันหรือเงื่อนไขทวน:
- Trigger พักผล/คืนรุ่น / ผู้ตัดสินใจ / ผู้คืน / ผู้ตรวจ:
- รุ่นที่มีหลักฐาน reviewed ที่จะคืน หรือเหตุคงพักถ้าไม่มีรุ่นใช้ได้:
- ผลเดิมที่ต้องถอน/แจ้งผู้รับ / ช่องทางสิทธิ์ / หลักฐานรับทราบที่ยังรอ:
- แผนทวน D01/D06/D09 และทุก case ที่ล้มเหลวหลังคืน / expected / actual not_run:
- ขอบ export private/public / redaction / ผู้ทวนสิทธิ์ / ผลต่อบริบท:
- สิ่งที่ต้องทดลองก่อน operational/camera/specialty claim และผู้มีหน้าที่:

## ตรวจราย ID

APP-M04-D-K01: R01–R08/input/output/เหตุ v0→v1 ครบ แยก row/target metadata/pixels RGB/thermal และขอบ controlled target/manual
APP-M04-D-S01: D01–D18 ผูก requirements มี normal/failure/time/pair/raw/partial/thermal/rollback/rights expected ถูกและ actual not_run
APP-M04-D-E01: ไม่มีข้ออ้าง validator/field/calibration/certification ที่ยังไม่มี แยก expected/actual และสิทธิ์ export
APP-M04-D-C01: เก็บรุ่น/issueก่อนหลัง ทุกคำทักมีคำตอบ พร้อมพัก/คืน/แจ้งผู้รับและทวนหลังคืน ไม่ทับประวัติหรือส่ง stale result

ใช้ rubric ลงมีหลักฐานตามเกณฑ์ / ต้องฝึกเพิ่ม / ยังไม่มีหลักฐานราย ID แก้ส่งซ้ำได้ ไม่อ้างว่าผู้เรียนหรือระบบพร้อมปฏิบัติงานจริง ไม่มี app component หรือ implementation ในผลส่งมอบนี้
