# M08 D: ข้อกำหนดและแผนทดสอบที่รักษาบริบท

รุ่น 1.17.22 · 12 ตุลาคม 2026 · แบบฝึก TABLETOP ONLY

ภาคเสริมรุ่น 1.18.24 · 14 ตุลาคม 2026: ขอบชั้นหลักฐานใน R05/D13/D20 ยังเป็นข้อเสนอทดสอบ `not_run`

ส่งมอบเอกสาร requirement/interface/test proposal เท่านั้น ไม่มี validator/uploader/import/runtime ฮาร์ดแวร์หรือการรัน test ทุก D01–D20 มี **actual=not_run**

## KSEC ก่อนเรียน เป้าหมายและหลักฐาน

| ID / พื้นฐานและงานเติม | เป้าหมาย / กิจกรรมและหลักฐาน | เกณฑ์ |
|---|---|---|
| APP-M08-D-K01: รู้ schema/key/null ตัวหารและการควบคุมรุ่น; ทวน [การทดสอบ](https://drone.pk-research.work/knowledge/testing/) และ [ระบบทั้งชุด](https://drone.pk-research.work/knowledge/integration/) แล้วเขียน blank ต่างจาก zero | อธิบาย R01–R08 และขอบที่ contract/metadata พิสูจน์ไม่ได้; input/output contract R01–R08 และเหตุเปลี่ยน D-v0→D-v1 | แยก numeric row/context pair/QA/independent field validation; ไม่ pool หรือเติม unknown |
| APP-M08-D-S01: ผูก requirement กับ input/expected และแผน recheck ได้; ทวน [การทดสอบ](https://drone.pk-research.work/knowledge/testing/) แล้วเขียน duplicate ทั้งสองแถวกัก | ออกแบบ D01–D20 ผ่าน interface พร้อมผลคาดหวังที่รักษากรณีผิด; 20-case matrix requirement links expected/actual และ rollback/recheck proposal | ครบ 20 กรณี actual ทุกกรณี not_run; ครอบคลุมขาด/ศูนย์/unknown/ผิด count/บริบท/รุ่น/CSV |
| APP-M08-D-E01: พร้อมแยก expected/actual และรักษาข้อความไม่เชื่อถือ; ทวน [รายงานหลักฐาน](https://drone.pk-research.work/knowledge/imagery-analysis/evidence-report/) แล้วแก้คำว่า tested เป็น proposal | รายงานระดับหลักฐานและเสนอการส่งออกข้อมูลเฉื่อยตามสิทธิ์; claim/status/export policy พร้อม expected/actual และขอบ sensitive sharing | ไม่มี validator/upload/import/runtime หรือ ecological autoapproval; CSV ไม่ execute สูตร/คำสั่ง/path |
| APP-M08-D-C01: พร้อมคง baseline รับคำทักและระบุผู้พัก/คืน/ทวน; ทวน [หน้าที่ทีม](https://drone.pk-research.work/knowledge/human-factors/teamwork/) แล้วระบุ trigger เปลี่ยน sensor/class | ควบคุมการเปลี่ยนและคืนรุ่นโดยมีร่องรอยและเจ้าของ; D-v0/D-v1 input/schema/rules/config/class/output change/rollback/recipient log | sensor/FW/software/season/water/class เปลี่ยนต้อง re-review/reconcile; คืน known-reviewed หรือ hold และแจ้ง stale |

## เปรียบก่อน/หลังและ contract ที่เสนอ

D-v0 เป็นตัวอย่างแนวคิดที่ผิด: เติม unknown/blank เป็น 0 รวมทุกโซน/บริบท แสดง +12.5 pp เป็น recovery และเปลี่ยน sent เป็น approval ให้เก็บข้อความเดิมพร้อมเหตุที่ต้องแก้ D-v1 เสนอ contract ที่รักษา count basis สถานะ บริบท unknown และ versions ข้อเสนอ v1 ยังไม่ใช่ระบบที่สร้างหรือผ่านการทดสอบ

Input: schema 23 fields ใน [readme](https://drone.pk-research.work/downloads/drone-applications/environment-monitoring-readme.md) พร้อม declared input/schema/rules/config/class/output version ที่เสนอ; metadata เป็น author assumption ไม่เป็น ground proof

Output ที่เสนอ: record_id/pair_id ____ disposition/reason ____ known/coverage/among-known/full-grid interval หรือ undefined ____ arithmetic_scope=tabletop ____ field_comparison=unqualified ____ raw/field/class/review status ____ owner/nextcheck ____ versions ____ share/handover state ____ ไม่สร้าง ecological approval

| Requirement | ข้อกำหนดที่ผู้ตรวจทวน |
|---|---|
| R01 | Input มี schema 23 ช่องและ provenance/status ครบ; blank ต่างจาก 0 ข้อความเป็นข้อมูล ไม่เดาที่มาหรือเติมสถานะ |
| R02 | Counts ครบเป็น finite nonnegative integer และรวมตรง total; missing/negative/fractional/bad sum กักพร้อม reason; key ซ้ำกักทุกแถว ไม่ first/last wins |
| R03 | Pair แยกจาก row: case/zone/boundary/grid/season/water/sensor/class/count basis ต้องเข้ากันได้; ต่างบริบท blocked จน review/reconcile ไม่ pool โซน/แบนด์/หน่วย |
| R04 | รักษา unknown และตัวหาร: สูตร coverage/among-known/full-grid interval ตามนิยาม zero total/all unknown มี undefined ที่ถูก; delta interval ไม่เป็น trend/confidence/causal claim |
| R05 | Arithmetic scope=tabletop; field comparison=unqualified ทุกแถว QA แยก independent map/species/field validation RTK/PPK ไม่ accuracy; ไม่มี unknown mask/spatial matching จึงไม่อ้าง transition หรือ ecological approval; ช่องเป้าหมาย/ตัวชี้วัด/ฐานอ้างอิง/ภาคพื้น/ผู้ทวนที่ขาดต้องคง missing และห้ามยกระดับ evidence scope อัตโนมัติ |
| R06 | Resource requested/confirmed กับ receipt/acknowledgement/domain approval แยกมีหลักฐาน; sensitive master ควบคุม สำเนาลดรายละเอียดพร้อม redaction; disturbance uncertainty/distress ให้ hold/replan/fallback |
| R07 | เก็บ input/schema/rules/config/sensor/class/output versions เปลี่ยน season/water/sensor/mount/FW/software/class ต้อง impact/re-review/reconcile และ rollback known-reviewed หรือ hold มี owner/แจ้ง stale/recheck |
| R08 | CSV เป็น inert text ไม่ execute formula/command/path; output มี disposition/reason/evidence scope/owner/nextcheck; expected แยก actual=not_run ไม่มี runtime/uploader/import/autoapproval ที่ส่งมอบ |

ฝึกระบุ [ชั้นหลักฐาน](https://drone.pk-research.work/knowledge/drone-applications/environment-monitoring/#restoration-evidence) ใน contract ที่เสนอ: `teaching_arithmetic` สำหรับ TRAIN-ENV-01; `image_observation`, `site_interpretation` และ `restoration_decision` เป็นชั้นในแบบออกแบบที่ต้องมีหลักฐานต่างกัน ไม่ใช่สถานะ runtime ที่ส่งมอบ ช่องที่ยังขาดให้ส่ง `missing` พร้อม owner/nextcheck แทน `approved` ทดสอบข้อจำกัดนี้กับ D13 และ D20 โดยยังเขียน actual=`not_run`

## แผนทดสอบ 20 กรณี ทุก actual=not_run

| ID / requirement | Input ที่เสนอ | Expected ตามการออกแบบ | Actual |
|---|---|---|---|
| D01 / R01–R05 | A01/A02 ตาม fixture | coverage 80/80%; among-known 50/62.5%; full-grid 40–60/50–70%; +12.5 pp among-known แต่ whole-grid delta −10..+30 pp; tabletop เท่านั้น | not_run |
| D02 / R01,R02 | Q01 vegetation ว่าง และ proposal nonfinite count | กัก missing/invalid พร้อมเหตุ ไม่เติม 0 ไม่คำนวณเป็นข้อมูลครบ | not_run |
| D03 / R02,R04 | U01 total100 unknown100 | coverage0%; among-known undefined; full-grid0–100%; ไม่มี pair ไม่ unseen=other | not_run |
| D04 / R02,R04 | Z01 total/ทุก count0 | จำนวนศูนย์ valid; coverage/among-known/full-grid percentage undefined; ไม่มี pair | not_run |
| D05 / R02 | proposal count −1 โดยไม่แก้ fixture | กัก negative พร้อมเหตุ ไม่ clamp | not_run |
| D06 / R02 | proposal count 1.5 โดยไม่แก้ fixture | กัก fractional พร้อมเหตุ ไม่ round ให้ผ่าน | not_run |
| D07 / R02 | proposal total100 แต่ counts รวม99 | กัก bad sum พร้อมเหตุ ไม่เติม unknown เพื่อผ่าน | not_run |
| D08 / R02 | Q02/Q03 key เดียวกัน counts ต่าง | กักทั้งสองแถว; ไม่ first/last wins และไม่เพิ่มจำนวนรวม | not_run |
| D09 / R03 | B01/B02 season S1→S2 | คง row counts; blocked_season ไม่ delta จนทวนบริบท | not_run |
| D10 / R03 | C01/C02 water W1→W2 | blocked_water ไม่ตีการจมน้ำ/การมองไม่เห็นเป็น nonvegetation | not_run |
| D11 / R03,R07 | E01/E02 boundary E-v1→E-v2 | blocked_boundary ขอฐานร่วม/reconciliation ไม่ back-edit | not_run |
| D12 / R03,R07 | D01/D02 RGB1/CL1→MS2/CL2 | blocked_sensor_class ขอ calibration/class crosswalk และ review ไม่เทียบเดิมเงียบ | not_run |
| D13 / R05 | ทุก fixture raw/field/class validation และเป้าหมายไซต์ยังขาด | คง teaching_arithmetic/field unqualified; ไม่สร้าง image_observation, site_interpretation หรือ approval จาก parser/counts | not_run |
| D14 / R05 | proposal RTK/PPK flag มี แต่ไม่มี product validation | ref ไม่เป็น achieved accuracy ขอ control/independent validation ที่เหมาะ | not_run |
| D15 / R04,R05 | A counts ไม่มี cell geometry/unknown mask/spatial matching | ไม่อ้าง cell transition/gain/trend/recovery; คง delta interval ไม่ confidence interval | not_run |
| D16 / R06 | ขอทีม/ชุดยัง unanswered และขอ sensitive master ไป public | requested ไม่ confirmed; hold/fallback; controlled master กับ purpose-minimal/coarsened copy/redaction | not_run |
| D17 / R06,R07 | ส่งไฟล์ตามสิทธิ์และผู้รับที่ยืนยันแล้วแต่ไม่มี receipt; ผู้รับยังใช้ output รุ่นเก่า | pending_receipt หลังการส่งตามสิทธิ์ ไม่ acknowledged/approved; แจ้ง stale กับรุ่นแทนและ owner | not_run |
| D18 / R07 | proposal เปลี่ยน sensor/mount/FW/software/class หรือคืนรุ่น | impact/re-review เก็บทุก version คืน known-reviewed หรือ hold พร้อม owner/recheck ไม่สืบ pass เดิม | not_run |
| D19 / R08 | proposal note เริ่ม =,+,-,@ หรือเป็น command/path | แสดงและส่งออกเป็นข้อความเฉื่อยตาม policy ที่ทวน ไม่ execute/เปิด path อัตโนมัติ | not_run |
| D20 / R03,R05,R06 | ขอรวม A/B ทุกโซนเป็น ecosystem% และให้ approval แม้ disturbance ไม่แน่ | บล็อก pooling/ecological approval; คง unknown และ hold/replan ขอเป้าหมาย/ตัวชี้วัด ฐานอ้างอิง ภาคพื้นและผู้มีบทบาทพื้นที่/นิเวศทวน | not_run |

Expected เป็น model answer สำหรับทวนเอกสาร ไม่มีผล test ผ่าน/ไม่ผ่าน ไม่เพิ่ม bad sum/negative/fractional proposal ลง CSV จริง

## Version การปรับแต่งและการคืนค่า

เก็บ D-v0/D-v1 พร้อม input/schema/rules/config/sensor/FW/class/output versions และ issue log หากเปลี่ยน sensor/mount/firmware/software ต้องขอ manual/compatibility/calibration/time/mass/power/CG และ independent product validation หากเปลี่ยน season/water/classification ต้องให้บทบาทนิเวศทวน context/crosswalk/reconciliation ก่อนใช้ baseline เดิม

Rollback proposal: trigger ____ ผู้พัก ____ owner คืน ____ รุ่น known-reviewed ____ หรือ hold เมื่อยังไม่มีรุ่นที่ทวน ____ ผู้ทวนหลังคืน ____ ผู้รับที่ต้องแจ้ง stale ____ recheck D01 และกรณีผิดที่เกี่ยวข้อง ____ actual=not_run ____ ห้ามคืน D-v0 ที่ผิดแล้วอ้างพร้อมใช้

Issue/correction log: คำทัก ____ คำตอบ/หลักฐาน ____ รุ่นก่อน/หลัง ____ ผลกระทบต่อผู้รับ ____ owner ____ งานต่อ/เงื่อนไขทวน ____ ไม่ปิดค้างที่ยังไม่มีหลักฐาน

## Fixture ที่ใช้ได้โดยไม่ต้องมีโดรน

**TRAIN-ENV-01 เป็น TABLETOP ONLY** ผู้เรียบเรียงแต่งจำนวนและบริบททั้ง 15 แถว ไม่มีภาพต้นทาง label mask รูปทรงเซลล์ พิกัด วันที่สำรวจ ชนิดพืชหรือการวัดจริง period_day 1/8 เป็นวันสัมพัทธ์ รหัส S1/S2 W1/W2 RGB1/MS2 CL1/CL2 GRID-1 และ boundary เป็นบริบทสมมติ ไม่ใช่ฤดูกาล ระดับน้ำ calibration ระบบพิกัดหรือ grid ที่ตรวจแล้ว สมมติว่าเซลล์มีพื้นที่เท่ากันเพื่อสอนจำนวนเท่านั้น ไม่มีพื้นที่ m² ความอุดมสมบูรณ์ biomass NDVI หรือ classification accuracy ให้อนุมาน

ทุกแถวมี case_id=TRAIN-ENV-01, grid_version=GRID-1, count_basis=author_assumed_equal_area_cell_counts, metadata_origin=author_provided_teaching_assumption, measurement_status=not_performed, raw_media_status=not_supplied, field_check_status=not_performed, classification_validation_status=not_performed, review_status=pending_field_review และ sensitive_share_status=controlled_teaching_metadata_only **ทุกแถวยังไม่พอสำหรับข้อสรุปสนาม** specialist=not_assigned; ไม่มีผลผู้เรียนหรือผู้ตรวจสาขา

ใช้ไฟล์ตาม [CSV 15 แถว](https://drone.pk-research.work/downloads/drone-applications/environment-monitoring-observations.csv) · [readme และ schema 23 ช่อง](https://drone.pk-research.work/downloads/drone-applications/environment-monitoring-readme.md) · [rubric 12 ID](https://drone.pk-research.work/downloads/drone-applications/environment-monitoring-rubric.md) · [learning record](https://drone.pk-research.work/downloads/drone-applications/ksec-learning-record.md) หรืออ่านค่าทั้งหมดด้านล่างได้ ทุกจำนวนเป็น author assumption; Q01 ว่างไม่ใช่ 0 ช่องสถานะทั้งหมดรักษาตามข้อความข้างต้น

| ID / zone | day | boundary | season / water / sensor / class | total / vegetation / other / unknown | disposition สอน |
|---|---|---|---|---|---|
| A01 / A | 1 | A-v1 | S1 / W1 / RGB1 / CL1 | 100 / 40 / 40 / 20 | tabletop_pair_A |
| A02 / A | 8 | A-v1 | S1 / W1 / RGB1 / CL1 | 100 / 50 / 30 / 20 | tabletop_pair_A |
| B01 / B | 1 | B-v1 | S1 / W1 / RGB1 / CL1 | 100 / 40 / 40 / 20 | blocked_season |
| B02 / B | 8 | B-v1 | S2 / W1 / RGB1 / CL1 | 100 / 50 / 30 / 20 | blocked_season |
| C01 / C | 1 | C-v1 | S1 / W1 / RGB1 / CL1 | 100 / 40 / 40 / 20 | blocked_water |
| C02 / C | 8 | C-v1 | S1 / W2 / RGB1 / CL1 | 100 / 50 / 30 / 20 | blocked_water |
| D01 / D | 1 | D-v1 | S1 / W1 / RGB1 / CL1 | 100 / 40 / 40 / 20 | blocked_sensor_class |
| D02 / D | 8 | D-v1 | S1 / W1 / MS2 / CL2 | 100 / 50 / 30 / 20 | blocked_sensor_class |
| E01 / E | 1 | E-v1 | S1 / W1 / RGB1 / CL1 | 100 / 40 / 40 / 20 | blocked_boundary |
| E02 / E | 8 | E-v2 | S1 / W1 / RGB1 / CL1 | 100 / 50 / 30 / 20 | blocked_boundary |
| Q01 / F | 8 | F-v1 | S1 / W1 / RGB1 / CL1 | 100 / ว่าง / 40 / 20 | quarantine_missing |
| Q02 / G | 8 | G-v1 | S1 / W1 / RGB1 / CL1 | 100 / 50 / 30 / 20 | quarantine_duplicate_both |
| Q03 / G | 8 | G-v1 | S1 / W1 / RGB1 / CL1 | 100 / 60 / 20 / 20 | quarantine_duplicate_both |
| Z01 / H | 8 | H-v1 | S1 / W1 / RGB1 / CL1 | 0 / 0 / 0 / 0 | zero_total |
| U01 / I | 8 | I-v1 | S1 / W1 / RGB1 / CL1 | 100 / 0 / 0 / 100 | all_unknown |

จัดเป็น **2 แถวในคู่ A**, **8 แถวใน 4 คู่บล็อก B/C/D/E**, **3 แถวกัก Q01/Q02/Q03**, **1 แถว Z01 total ศูนย์** และ **1 แถว U01 unknown ทั้งหมด** ไม่มีอัตราผ่านจาก 15 แถว B เปลี่ยน season, C เปลี่ยน water, D เปลี่ยน sensor/class, E เปลี่ยน boundary จึงไม่ทำ delta ข้ามรอบก่อนทวนและ reconcile หลักฐาน Q01 vegetation ว่างคงว่าง Q02/Q03 ซ้ำ logical key (case_id, zone_id, period_day, boundary_version, grid_version) ต้องกักทั้งคู่ ไม่เลือกแรก/สุดท้าย Z เก็บจำนวนศูนย์ได้แต่ทุกเปอร์เซ็นต์ไม่มีนิยาม U มี coverage 0% ที่นิยามได้ ส่วน vegetation among known ไม่มีนิยามและช่วงทั้ง grid 0–100% ทั้ง Z/U ไม่มีคู่ต่างรอบ

## สูตรและแนวคำตอบ

```text
known = vegetation_cells + other_cells
known_coverage = 100 × known / total_cells เมื่อ total_cells > 0
vegetation_among_known = 100 × vegetation_cells / known เมื่อ known > 0
full_grid_lower = 100 × vegetation_cells / total_cells เมื่อ total_cells > 0
full_grid_upper = 100 × (vegetation_cells + unknown_cells) / total_cells เมื่อ total_cells > 0
```

| แถว | known / coverage | vegetation among known | ช่วงสัดส่วน vegetation ทั้ง grid |
|---|---|---|---|
| A01 | 80 / 80% | 50% | 40–60% |
| A02 | 80 / 80% | 62.5% | 50–70% |
| Z01 | 0 / undefined | undefined | undefined |
| U01 | 0 / 0% | undefined | 0–100% |

A01→A02 ต่างกัน +12.5 จุดร้อยละ (pp) ในส่วนที่ทราบป้าย และขอบล่างต่าง +10 pp ทั้งสองค่าเป็นคณิตศาสตร์สอน ไม่ยืนยัน vegetation gain จำนวนรวมไม่บอกการย้ายป้ายรายเซลล์ ไม่มี spatial matching หรือ unknown mask ช่วงผลต่างทั้ง grid แบบรักษาข้อไม่รู้คือ [50−60, 70−40] = **[−10, +30] pp** ซึ่งครอบคลุมทั้งการลดและเพิ่ม จึงยังยืนยันแนวโน้มหรือการฟื้นฟูเชิงสาเหตุไม่ได้ ช่วงนี้ไม่ใช่ confidence interval ค่าความไม่แน่นอนการวัดหรือ statistical significance

ห้าม pool โซน/บริบท/แบนด์/หน่วย ห้ามตี unseen เป็น nonvegetation ไม่มีพื้นที่ m² species abundance biomass NDVI accuracy หรือ ecosystem/project percent จาก fixture

## ตรวจตนเองและแก้ส่งซ้ำ

| ID | ต้องแก้ | มีหลักฐานตามเกณฑ์ | งานแก้และส่งซ้ำ |
|---|---|---|---|
| APP-M08-D-K01 | parser ผ่านเท่ากับแผนที่ถูกต้องหรือนิเวศยืนยันแล้ว | คง provenance และ field unqualified แม้ A คำนวณได้ | เติม reason และระดับหลักฐานใน contract แล้วทวน |
| APP-M08-D-S01 | ใส่ passed โดยไม่รันหรือเปลี่ยน missing เป็น zero | expected มี disposition/reason และไม่สร้าง field claim | เติม input/expected ที่ขาดและทวน A กับกรณีผิดหลังคืนรุ่น |
| APP-M08-D-E01 | รัน note เป็นคำสั่งหรืออ้าง tests ผ่าน | คง not_run และออกแบบแสดงข้อความตามสิทธิ์ | ถอน claim และทวน export policy กับผู้รับผิดชอบ |
| APP-M08-D-C01 | ใช้ผลผ่านเดิมกับ sensor ใหม่หรือคืน v0 ที่ผิดแล้วเรียกพร้อม | เก็บรุ่นก่อนหลังพร้อมผลกระทบ owner และ recheck ที่ยัง not_run | เติม trigger รุ่นคืนและผู้รับ แล้วทวนข้อค้างซ้ำ |

เก็บก่อน/หลัง วัน ผู้ตรวจ เกณฑ์รุ่นและคำตอบข้อทัก ใช้ผลมีหลักฐานตามเกณฑ์/ต้องฝึกเพิ่ม/ยังไม่มีหลักฐานราย ID ไม่รวมเป็นเปอร์เซ็นต์ความพร้อมสนาม กรณี E/C ต้องมีเหตุการณ์ที่ทวนได้ ไม่ตัดสินบุคลิกถาวร ไม่มีผลผู้เรียนจริง


## ขอบแหล่งและสิทธิ์

กิจกรรม จำนวน สูตรและเกณฑ์เป็นงานเรียบเรียงใหม่ แหล่งหลักและขอบที่อ่านอยู่ใน [readme](https://drone.pk-research.work/downloads/drone-applications/environment-monitoring-readme.md) และ [บท M08](https://drone.pk-research.work/knowledge/drone-applications/environment-monitoring/) ไม่ถือเอกสารเหล่านั้นเป็น flight protocol ของไซต์จริง specialist=not_assigned; pending_field_review และ P3 gate เปิด ไม่มีการวัด ภาคสนามหรือผลผู้เรียน

ใบงาน rubric และ fixture เรียบเรียงใหม่โดย PK-Research / Drone-Hub รุ่น 1.17.22 วันที่ 12 ตุลาคม 2026 ใช้ [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) ระบุผู้เรียบเรียง ชุด/รุ่นและสิ่งที่แก้ แหล่งอ้างอิงและสื่อภายนอกคงสิทธิ์เจ้าของเดิม
