# ชุดฝึก S2 · เปรียบเทียบข้อมูลน้ำและชายฝั่งสองเวลา

`scenario.csv` คือ **synthetic_training_data** และ `expected.csv` คือ **expected_training_result** ตาม `CSC-RULE-v1` ของผู้แต่ง ไม่ใช่แผนที่ ภาพถ่าย ผลประมวลผล ผลผู้เรียน หรือการวัดชายฝั่งจริง ภาพประกอบบทเป็นภาพสร้างเพื่อสอนคนละชนิดกับ CSV. อ่านบทที่ [/knowledge/drone-applications/case-studies/coastal-change/](https://drone.pk-research.work/knowledge/drone-applications/case-studies/coastal-change/). ชุดดาวน์โหลดมี 7 ไฟล์: `scenario.csv`, `expected.csv`, `readme.md`, `beginner.md`, `operator.md`, `developer.md`, `rubric.md`.

เปิด CSV แบบ UTF-8 และกำหนดคอลัมน์เป็นข้อความก่อนนำเข้าตารางคำนวณเพื่อรักษา offset, `unknown`, รหัส และเครื่องหมายบวก/ลบ. เก็บไฟล์ต้นฉบับเป็น read-only. กฎสอนนี้ไม่มีพิกัดโลก/CRS ไทย, แนวชายฝั่งจริง, ค่าระดับน้ำจริง, DEM, ภาพต้นทางหรือเครื่องมือแปลง datum ที่ตรวจใช้กับไทยแล้ว. ตัวเลขและวันในไฟล์แต่งขึ้นทั้งหมด.

## คำขอ ผู้รับ และผลที่อนุญาต

`request_id=REQ-CSC-01`. `COAST_TEAM` เป็นผู้รับสมมติซึ่งต้องทราบภายใน `2026-10-14T12:00:00+07:00` ว่า Z-A ถึง Z-C มี **ข้อสังเกตดิบใด** จากสองรอบ และต้องเก็บ/ตรวจอะไรเพิ่มก่อนสรุปการเปลี่ยนเชิงพื้นที่. Z-A–Z-C เป็นช่องฝึกใน `LOCAL-XY-v1` ไม่มีตำแหน่ง ขนาดขอบเขต หรือ georeferencing โลก. E0=`2026-05-13`, E1=`2026-10-13` เป็นเวลาฝึกห่างกันห้าเดือน; ฤดูกาลของพื้นที่จริงยัง `unknown`. สรุปที่รับได้คือทะเบียน `HOLD` และแผนเก็บซ้ำ ไม่ใช่คำรับรองการกัดเซาะ การพอกพูน ความปลอดภัย หรือสาเหตุ.

ข้อกำหนด `rights=training_only` ใช้จัด package ในบทเรียน ไม่ใช่การตั้ง access control ของไฟล์ดาวน์โหลดสาธารณะ. ผู้เรียนต้องติดป้ายว่า output เป็นข้อมูลฝึกเมื่อส่งต่อ. ผู้ตรวจเฉพาะสาขา `not_assigned`; P3=`pending_field_review`; P5 ผู้เรียน B/O/D=`0/0/0, NOT_RUN`; CLO/PLO=`pending_design`.

## สัญญา package ที่ส่งให้ผู้รับ

ใช้หัวข้อต่อไปนี้ในชิ้นงาน B/O/D และ manifest ทุกฉบับ เพื่อให้ `COAST_TEAM` ทวนได้โดยไม่ต้องเปิดเอกสารใน repository:

| หัวข้อ | ช่องขั้นต่ำในกรณีนี้ |
|---|---|
| `request` | `REQ-CSC-01`, คำถาม, ผู้ขอ/ผู้รับ `COAST_TEAM`, `decision_at=2026-10-14T12:00:00+07:00`, owner คำขอ |
| `scope` | Z-A–Z-C, E0/E1, `LOCAL-XY-v1`, `LOCAL-V-A/B`, tide level `unknown`, coverage รายคู่, รุ่น `CSC-RULE-v1`, สิ่งที่อยู่นอกขอบ |
| `alternatives` | ข้อมูลเดิม / ภาคพื้น / ทีมอื่น / โดรน, เหตุเลือกหรือพัก, `requested` กับ `confirmed` แยกหลักฐาน |
| `observation` | A/C ผลต่าง **x ดิบ** พร้อม source row/revision, B ไม่มีค่า, CHK1/CHK2, ระดับหลักฐาน `synthetic_training_data` หรือ `expected_training_result` ให้ตรง |
| `unknowns` | วิธีแปลง datum ที่ใช้กับพื้นที่, ระดับน้ำจริง, ฤดูกาล/สถานที่จริง, B1 feature, CHK2-E1, เกณฑ์ checkpoint และ owner/วันทวนแต่ละข้อ |
| `limits` | ขอบ ±0.40 m เฉพาะการอ่าน x, ไม่มี uncertainty รวม, ไม่ยืนยัน erosion/safety/permission/field result |
| `action` | สิ่งที่ผู้มีหน้าที่ต้องหา/เก็บใหม่, เงื่อนไขที่จึงเริ่มเทียบ, fallback หากข้อมูลยังไม่พอ |
| `owner` | เจ้าของ package, เจ้าของการเก็บ/ทวน, ผู้มีหน้าที่อนุมัติข้อความและสิทธิ์ (หากยังไม่กำหนดเป็น `unknown`) |
| `handoff` | manifest ID/รุ่น/รายการแนบ/rights/ผู้ส่ง/ผู้รับ/เวลาส่ง/สถานะรับ/ข้อค้าง; `draft → sent → received → acknowledged` ต้องมีหลักฐานและผู้กระทำของแต่ละขั้นจริง มิฉะนั้นคงขั้นก่อนหน้าหรือ `unknown` |

หากมีการแก้ผลหลังส่ง ต้องออก revision ใหม่ เก็บฉบับเดิมและบอกผู้รับเดิมว่าอะไรเปลี่ยน. การสร้างไฟล์หรือการส่งคำสั่งในเครื่องไม่เท่ากับ `received` หรือ `acknowledged` ของคน. ชุดนี้ไม่มี manifest ส่งจริงหรือการรับจริง.

## พจนานุกรมข้อมูล

สิบคอลัมน์แรกเป็นสัญญา S0. คีย์ `(scenario_id,record_id,revision)` ไม่ซ้ำในชุดนี้; `source_row` ใน expected ชี้เลขบรรทัดจริงรวม header. `unknown` แปลว่าไม่มีหลักฐาน ไม่ใช่ศูนย์หรือค่าที่รอกรอกโดยเดา.

| คอลัมน์ | นิยามและขอบใช้ |
|---|---|
| `scenario_id` | `TRAIN-CSC-01` เป็นรหัสสถานการณ์แต่ง ไม่มีภูมิศาสตร์จริง |
| `record_id` | A0/A1, B0/B1, C0/C1 เป็นคู่ขอบน้ำที่เห็น; CHK1/CHK2 เป็น checkpoint; GCP1 เป็นจุดควบคุมที่ใช้ประมวลผล |
| `observed_at` | เวลาสังเกต ISO 8601 พร้อม `+07:00`, ไม่ใช่เวลานำเข้าหรือเวลาตัดสินใจ |
| `source` | `SYN-ORTHO`, `SYN-CHK`, `SYN-GCP` ล้วนเป็น **คำบรรยายข้อมูลแต่ง** ไม่ได้มี orthomosaic/measurement จริงแนบ |
| `revision` | `v0` ทุกแถว; หากแก้ให้เพิ่ม revision และเก็บฉบับเดิม ไม่ทับไฟล์ต้นฉบับ |
| `coverage` | `full`=feature ที่โจทย์กำหนดมองเห็นในช่องนั้น, `partial`=มีภาพเพียงบางส่วน, `point`=รายการจุด, `none`=ไม่มีการอ่านใช้ได้; ไม่ใช่ร้อยละหรือ area จริง |
| `uncertainty` | `0.40_m_digitizing_proxy` คือสมมติ ±0.40 m **ต่อการอ่านค่า x ของขอบน้ำหนึ่งรอบ** เพื่อฝึกเลขคณิตเท่านั้น; ไม่รวม tide, datum, การจับคู่ภาพ/โมเดล หรือ field accuracy; `unknown` หมายถึงไม่มีค่าที่พิสูจน์ได้ |
| `status` | `unverified`, `hold_missing_feature`, `measured_in_scenario`, `hold_missing_checkpoint`, `control_in_scenario` เป็นสถานะแต่งของรายการ; `measured_in_scenario` ไม่ใช่วัดจริง |
| `rights` | `training_only` ทุกแถว ต้องติดป้าย synthetic เมื่อส่ง |
| `recipient` | `COAST_TEAM` เป็นบทบาทสมมติ ไม่ใช่หลักฐานว่ามีผู้รับหรือรับทราบจริง |
| `epoch_id` | E0 หรือ E1, อย่าจับคู่ข้ามแถวเพียงเพราะลำดับไฟล์ |
| `zone_id` | Z-A ถึง Z-C เป็นช่องฝึก; checkpoint/processing control ผูกช่องเพื่อสอนการครอบคลุม |
| `feature_type` | `visible_waterline` คือรอยน้ำที่มองเห็นในโจทย์ ไม่ใช่ shoreline ทางกฎหมายหรือขอบดินที่ยืนยัน; `stable_marker` เป็น marker สมมติ; `processing_control` เป็น input โมเดล |
| `local_x_m`, `local_y_m` | พิกัดเมตรใน `LOCAL-XY-v1` เท่านั้น; `unknown` สำหรับจุดที่ไม่ได้ให้พิกัดหรือ feature ที่มองไม่ครบ. ค่า x ไม่ใช่ระยะกัดเซาะหรือระดับความสูง |
| `horizontal_frame` | `LOCAL-XY-v1` เป็นกรอบสองมิติฝึกเดียวกันทั้งรอบ ไม่แปลงไปโลกจริง; ยังต้องตรวจ coregistration จาก checkpoint |
| `vertical_datum` | `LOCAL-V-A` ใน E0, `LOCAL-V-B` ใน E1 เป็นชื่อระดับอ้างอิงสมมติ **ต่างกัน** ไม่มี offset หรือ transformation model ให้ใช้ |
| `tide_stage`, `tide_level_m` | E0=`low`, E1=`high`; ระดับน้ำตัวเลข=`unknown` ทั้งหมด. ไม่มีค่าที่ใช้ปรับน้ำหรือเปรียบชายฝั่งบนระดับเดียวกัน |
| `control_role` | `none`, `independent_checkpoint`, `processing_control` ต้องคงแยก; GCP1 ใช้สร้างโมเดล จึงไม่ใช่หลักฐานตรวจอิสระของโมเดลเดียวกัน |
| `residual_x_m` | ความต่าง x ของ checkpoint สมมติเทียบ marker ใน epoch นั้น พร้อมเครื่องหมาย; CHK1 +0.10→+0.60 m; CHK2 E1 unknown. ใช้ชี้ความเสี่ยง co-registration ไม่ใช่ค่าคลาดเคลื่อนรวมของงานจริง |
| `received_at` | เวลาไฟล์เข้าชุดโจทย์ พร้อม offset; ไม่ใช่ผู้รับตอบรับหรือเวลา capture |

## กฎ `CSC-RULE-v1` และวิธีคำนวณที่ตรวจได้

1. เก็บ 12 แถวทั้งสอง epoch; ตรวจ schema, offset, key, version, recipient/rights, horizontal frame และชนิดของค่า `unknown` ก่อนจับคู่. Expected มีผลหนึ่งรายการต่อหนึ่งแถว.
2. สำหรับคู่ขอบน้ำ A/C เท่านั้น คำนวณ **ผลต่างดิบของตำแหน่ง x ที่มองเห็น** `x_E1 - x_E0`: A=`17.00−20.00=−3.00 m`; C=`58.50−60.00=−1.50 m`. บันทึกชื่อ feature และกรอบท้องถิ่นไปกับตัวเลข. B1 ไม่มี x จึงไม่คำนวณ.
3. ช่วงเลขคณิตจากสมมติการอ่าน x ±0.40 m/รอบ ใช้วิธี worst-case `delta ± (0.40+0.40)`: A=`[−3.80,−2.20] m`; C=`[−2.30,−0.70] m`. ช่วงนี้ **ไม่ใช่ช่วงความเชื่อมั่น**, ไม่รวม bias, น้ำ, datum, ฤดู, checkpoint/โมเดล หรือขอบพื้นที่. จึงใช้เป็นคำตัดสินการเปลี่ยนชายฝั่งไม่ได้ แม้ช่วงไม่คร่อมศูนย์.
4. CHK1 มี residual x E0=`+0.10`, E1=`+0.60 m` จึงต่างกัน `+0.50 m`. ต้องสืบการผูกภาพ/พิกัดและสอบทานกับเกณฑ์โครงการที่ตกลงก่อนงานจริง; **ไม่มีเกณฑ์ผ่านตัวเลขใน fixture**. CHK2 E1=`unknown` ต้องกลับไปเก็บหรือจำกัดขอบ. GCP1 เป็น processing control จึงห้ามนับเป็น independent checkpoint.
5. ทุกคู่ A/C=`hold_datum_tide` จนมีวิธีแปลงระดับอ้างอิงที่ใช้ได้กับพื้นที่จริง, เวลาน้ำที่ตรวจแล้ว, จุดตรวจอิสระ, กรอบซ้ำและการทวนโดยผู้มีหน้าที่. Z-B=`hold_coverage_missing` แม้จะแก้ datum. CHK1/CHK2 ยังคงข้อค้างของตน. ไม่อ้างว่าภาพแสดงการกัดเซาะหรือสาเหตุของผลต่าง.
6. ห้ามใช้ [NOAA VDatum](https://oceanservice.noaa.gov/facts/vdatum.html) แปลงตัวเลขฝึกหรืออ้างว่าใช้ได้ในไทย. NOAA อธิบายหลัก **common vertical reference**; [หน้าเครื่องมือระบุขอบภูมิศาสตร์](https://coast.noaa.gov/digitalcoast/tools/vdatum.html) เป็น contiguous U.S. (ยกเว้น Great Lakes) และ Caribbean territories. วิธีแปลงในโจทย์นี้ = `unknown`, ต้องให้หน่วยงาน/ผู้เชี่ยวชาญท้องถิ่นยืนยันสำหรับงานจริง.

`expected_status`: `baseline_context`=ข้อมูลรอบตั้งต้น, `hold_datum_tide`=คู่ตัวเลขมีแต่ reference/น้ำขัด, `hold_coverage_missing`=คู่ feature ไม่ครบ, `checkpoint_context`=ค่า checkpoint รอบตั้งต้น, `hold_checkpoint_shift`=residual ข้ามรอบเปลี่ยน, `hold_missing_checkpoint`=จุดตรวจรอบใหม่ขาด, `control_not_checkpoint`=GCP ใช้ในโมเดล. `reason` กับ `next_check` เป็นรหัสอธิบาย/งานต่อ. `comparison_pair` ใช้จับคู่; `raw_delta_m`, `digitizing_only_interval_m`, `checkpoint_delta_m` ให้เฉพาะแถว E1 ที่คำนวณได้ นอกนั้น `unknown`. รูปแบบช่วง `[min|max]` ใช้ `|` เพื่อไม่ชน comma ใน CSV.

## ร่องรอยการตรวจและระดับหลักฐาน

ไฟล์ `expected.csv` เป็นเฉลยของผู้เขียน ไม่ใช่ output โปรแกรม. สคริปต์ผู้เขียนใน repository `scripts/verify-coastal-change-fixture.py` ตรวจคีย์/ความครบ/เลขคณิตและพิมพ์ SHA-256 ของ CSV กับเวลา/รุ่น Python เมื่อรัน; ผลนั้นเป็น `local_author_run` แยกจาก expected. หากไม่มี log ให้ `local_author_run=NOT_RUN`. การรันผ่านไม่ได้แทนผลผู้เรียนหรือ field verification. `learner_result=NOT_RUN`, `field_verified_result=NOT_RUN`; P5 B/O/D 0/0/0. การนำออกใช้จริงต้องตรวจที่มาภาพ สิทธิ์ คู่มืออากาศยาน พื้นที่ น้ำ datum วิธีสำรวจและผู้ตรวจเฉพาะสาขาแยกตามวัน/บริบท.
