RFC-0007 Amendment 2: supersede terminal ที่ไม่ได้ส่งมอบงานได้ทุกตัว (#21) - #25
Merged
Merged
Conversation
… FAILED (#21) approval/v1 บอกไว้สองครึ่ง: approval ที่หมดอายุใช้เดินงานไม่ได้ · ต้องขอใหม่ ครึ่งแรกบังคับแล้วใน #17 (ExpiredApproval + APPROVED เข้า TIMEOUTABLE) ครึ่งหลัง ทำไม่ได้ — job ที่ approval หมดอายุจบที่ TIMED_OUT ซึ่งเข้า FAILED ไม่ได้ (RFC-0010) และ supersedes_job_id ตาม RFC-0007 Decision 1 ผูกไว้กับ FAILED เท่านั้น การยื่นใหม่ จึงกลายเป็น job ที่ไม่มีอะไรลิงก์กลับ และสายโซ่ audit ขาดตรงจุดที่คนตรวจจะถามพอดี RFC-0007 Amendment 2 ขยาย Decision 1 จาก FAILED เป็น terminal ทุกตัวที่จบโดย "ไม่ได้ส่งมอบงาน" — FAILED · CANCELLED · TIMED_OUT (states.SUPERSEDABLE) เจตนาของ Decision 1 คือสายโซ่ของความพยายามที่ตรวจสอบได้ ซึ่งใช้ได้กับงานที่หมดเวลา หรือถูกสั่งหยุดเหมือนกัน ข้อจำกัดที่ FAILED เป็นของแถมจากตอนเขียน ไม่ใช่ตัวข้อโต้แย้ง COMPLETED อ้างไม่ได้ · การ supersede คือการอ้างว่า "ใบนี้ไม่ได้ส่งมอบ ขอลองใหม่" งานที่ส่งมอบแล้วไม่ใช่ความพยายามที่รอความพยายามถัดไป — งานที่ต่อยอดจากมันคืองานใหม่ ที่ต้องมีเหตุผลของตัวเอง ถ้าปล่อยให้อ้างได้ สายโซ่จะเลิกแปลว่า "ความพยายาม" และกลาย เป็น pointer แบบ "เกี่ยวข้องกัน" ที่ต้องไล่ดู state ปลายทางทีละใบถึงจะรู้ว่าใบก่อนหน้า ได้ผลอะไรออกมาไหม · เหตุผลเต็มอยู่ใน Amendment 2 ไม่แตะตาราง transition เลย — ไม่มี edge ใหม่ · terminal ยังคง terminal · ไม่มีการปลุก job เดิม · ที่ผ่อนคือ "ใครถูกอ้างได้" เท่านั้น ไม่ bump semantics_version — job_state_machine อยู่ใต้ not_derived นอก subtree frozen ที่ drift_check ระบุเป็น hash scope เหมือนตอน RFC-0011 เพิ่ม edge - states.SUPERSEDABLE = TERMINAL - {COMPLETED} · Job.supersede() ตรวจกับชุดนี้ - TerminalState เลิกเสนอทาง recovery ให้ COMPLETED ซึ่งเป็นทางที่ถูกปฏิเสธ - flows.approval_expired_then_resubmitted เดินต่อจาก flow ของ #17 จนถึงการยื่นใหม่ - e2e_flow เพิ่มหมวด [3c] · replay ไล่สายโซ่จาก audit log อย่างเดียวได้ครบ - RFC-0010 กับ RFC-0011 อ้าง "FAILED" ในฐานะกฎเดิม — ใส่หมายเหตุชี้มาที่ Amendment 2 - platform-contract บันทึกช่องว่างที่ยังเหลือ: constructor รับ supersedes_job_id โดยไม่ตรวจว่าใบที่อ้างมีจริง/tenant เดียวกัน/จบแบบไม่ได้ส่งมอบจริง pytest 520 · payload_check 20 · e2e_flow 41 — FAIL=0 ทั้งหมด
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ปิด #21 — RFC-0007 Amendment 2:
supersedes_job_idอ้าง terminal ที่ ไม่ได้ส่งมอบงานได้ทุกตัว ไม่ใช่แค่
FAILEDapproval/v1บอกว่า approval ที่หมดอายุ "ต้องขอใหม่" · #17 บังคับครึ่งแรกไปแล้ว (ExpiredApproval)แต่ครึ่งหลังทำไม่ได้ — job ที่ approval หมดอายุจบที่
TIMED_OUTซึ่งอ้างไม่ได้การยื่นใหม่จึงเป็น job ที่ไม่มีอะไรลิงก์กลับ · สายโซ่ขาดตรงจุดที่คำถาม audit เริ่ม
กฎใหม่
Decision 1 เขียนกฎไว้กับ
FAILEDเพราะตอนนั้นคิดถึงแต่การกู้จากความล้มเหลว· แต่สิ่งที่มันต้องการจริงคือ สายโซ่ของความพยายามที่ตรวจสอบได้ — job ที่หมดเวลา
หรือถูกคนสั่งหยุด ก็เป็นความพยายามที่ใช้ไปแล้วไม่ต่างกัน
ไม่แตะตาราง transition เลย — ตรวจแล้วว่า
TRANSITIONSเหมือนmainทุก edge·
FAILEDยัง terminal · ใบที่ถูก supersede ยังโยนTerminalStateถ้าพยายามปลุก (มีเทสยืนยัน)· สิ่งที่เปลี่ยนคือ ใครถูกอ้างถึงได้ ไม่ใช่ใครเดินต่อได้
COMPLETEDอ้างไม่ได้ — ตั้งใจการ supersede คือการอ้างว่า "ใบนี้ไม่ได้ส่งมอบ นี่คือการลองใหม่" · งานที่
COMPLETEDส่งมอบไปแล้ว สิ่งที่ตามมาจากมัน (แก้บั๊ก · เฟสสอง · revert) คือ งานใหม่ที่มีเหตุผลของตัวเอง
ถ้าปล่อยให้อ้างได้จะเสียสามอย่าง:
ถ้ารับ
COMPLETEDคนอ่านต้องเปิด state ปลายทางทีละใบถึงจะรู้ว่าใบก่อนหน้าได้ผลอะไรออกมาไหมโดยไม่มี decision record ที่ไหนพูดแบบนั้น
"ต้องขอใหม่"ที่เป็นต้นเรื่องของ lifecycle: approval หมดอายุแล้ว "ต้องขอใหม่" — แต่ไม่มีทางขอใหม่ที่ลิงก์กลับงานเดิม #21 พูดถึง approval ที่หมดอายุ ซึ่งเป็นเคสตรงข้ามกับงานที่เสร็จแล้ว
Job.supersede()บนCOMPLETEDจึงโยนInvalidTransitionพร้อมข้อความที่บอกเหตุผล· สิ่งที่ follow-up จริง ๆ ต้องการคือ link คนละตัว ("ต่อยอดจาก") ที่มีชื่อและกฎของตัวเอง
— เขียนไว้ใน Future Work ของ RFC-0007 ไม่เอา field นี้ไปใช้ซ้ำ
ผลตรวจ
pytestpayload_check.pysimulation/e2e_flow.pyflow ใหม่ต่อจาก
approval_expiredที่ #17 ทิ้งไว้ — เดินจนถึงการยื่นใหม่ที่ลิงก์กลับแล้ว replay พิสูจน์ว่าสายโซ่ครบ · ไม่ bump
semantics_version(job_state_machineอยู่ใต้
not_derived:นอกhash_scopeของfrozen:เส้นเดียวกับ RFC-0011)ช่องว่างที่บันทึกไว้ ไม่ได้ปิด
Job(supersedes_job_id=...)ผ่าน constructor ยังไม่มีใครเฝ้า — ตรวจแค่รูปแบบ id· ใบที่อ้างมีจริงไหม · tenant เดียวกันไหม · จบแบบไม่ได้ส่งมอบจริงไหม ยังไม่มีใครตรวจ
·
supersede()บังคับครบเพราะถือ job ทั้งสองใบอยู่ในมือ แต่ทางที่ข้ามมันไปยังเปิดอยู่· ปิดจริงต้องมี job registry ซึ่ง repo นี้ยังไม่มี → ลง Future Work +
remaining:ไว้แทนที่จะสร้างครึ่ง ๆ
เก็บถ้อยคำที่หมดอายุไปพร้อมกัน
FAILEDjob that never passed governance would have nothingcoherent to supersede" — ใช้แยก
FAILEDออกจากตัวเลือกอื่นไม่ได้แล้ว เพราะ job ที่ถูกcancel ตั้งแต่
DRAFTตอนนี้เป็นเป้าที่ supersede ได้ · เป็นประโยคสนับสนุน ไม่ใช่ตัวข้อโต้แย้ง(Decision 1 ยืนบน "ยังไม่มีงานให้ล้ม" ซึ่งไม่ขยับ) → ใส่ note ลงวันที่ไว้ ไม่แก้คำตัดสิน
supersedes_job_idชี้FAILEDเป็นการเปรียบเทียบ→ แก้เป็นถ้อยคำที่ยังจริง พร้อมวงเล็บบอกว่าเดิมเป็นแบบนั้นจนถึง Amendment 2
Closes #21