RFC-0011: REQUIRE_CHANGES ไปจบที่ DRAFT — เปิดใช้ decision type ที่สามได้แล้ว - #22
Merged
Merged
Conversation
…SIS → DRAFT RFC-0002 ประกาศ decision ไว้สามค่าและ contract-semantics.yaml ปิดชุดนั้นไว้ แต่มีสองค่าเท่านั้นที่มีปลายทาง ค่าที่สาม engine ปฏิเสธมาตั้งแต่ issue #5 ด้วย UnmappedDecision เพราะยังไม่มี RFC บอกว่า job ที่ถูกตีกลับให้แก้ไปอยู่ไหน RFC-0011 ตอบว่า DRAFT ผ่าน edge ใหม่ GOVERNANCE_ANALYSIS -> DRAFT — ตรงกับ guarantee ที่ frozen ไว้ใน approval/v1 ("งานยังมีชีวิตและกลับมายื่นใหม่ได้") และไม่เพิ่ม vocabulary ใหม่ จึงไม่ลาก agent-platform เข้ามาเกี่ยว จุดที่ต้องอธิบายให้ชัด: REJECT กับ REQUIRE_CHANGES จบที่ DRAFT เหมือนกัน แต่แยกกันได้ด้วยเส้นทาง ไม่ใช่แค่ด้วย decision record — REJECT เดิน GOVERNANCE_ANALYSIS -> REJECTED -> DRAFT (state REJECTED ค้างใน history ตลอดไป) ส่วน REQUIRE_CHANGES เดินตรงและข้าม REJECTED คนที่อ่านย้อน จาก log อย่างเดียวจึงแยกออกได้ และสองครึ่ง (trail กับ decision) ตรวจกันเอง — trail ที่บันทึก REJECT บน edge ตรงถูก replay ปฏิเสธ ไม่ใช่เชื่อตาม มีเทสพิสูจน์ว่า replay แยกสอง flow นี้ออกจริง ผลที่ตามมา: คำถามว่า transition นี้เป็นคำตัดสินไหม กลายเป็นคุณสมบัติของ edge ไม่ใช่ของปลายทาง เพราะ DRAFT เข้าได้สองทางและมีทางเดียวที่เป็นคำตัดสิน DECISION_BY_TARGET จึงถูกแทนด้วย DECISION_BY_EDGE ทั้งฝั่ง engine และ replay - REQUIRE_CHANGES ล้าง approval เหมือน REJECT — ถูกสั่งให้แก้ไม่ใช่ได้รับอนุมัติ - direction lock, expires_at, และ APPROVED timeout (#17) ไม่ถูกแตะ - UnmappedDecision เก็บไว้เป็น backstop ของ decision type ใหม่ในอนาคต ที่ประกาศค่าโดยไม่ประกาศปลายทาง พร้อมเทสที่ยิงมันจริง - semantics_version ไม่ขยับ — ไม่มีอะไรใน frozen: เปลี่ยน (แบบเดียวกับ RFC-0010) - payload_check เช็คเดิมที่ยืนยันว่า REQUIRE_CHANGES ถูกปฏิเสธ กลับด้านแล้ว Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
RFC-0011 —
REQUIRE_CHANGESมีปลายทางแล้ว:GOVERNANCE_ANALYSIS → DRAFTหนึ่งในสามของ decision vocabulary ตายมาตั้งแต่ #5 — engine รับค่าไว้แต่ปฏิเสธการใช้งาน
เพราะไม่มีเอกสารไหนบอกว่า job ไปไหนต่อ · PR นี้ตอบคำถามนั้นและเปิดใช้งานจริง
ทำไมเป็นทางนี้
approval/v1ที่สุด — "REQUIRE_CHANGES ไม่ใช่ REJECT— งานยังมีชีวิตและกลับมายื่นใหม่ได้"
agent-platformเข้ามาผ่าน RFC-0009 + ADR(ต่างจากทางเลือกที่เพิ่ม state ที่ 14)
REJECTED → DRAFTเดิม ถูกตัดทิ้งเพราะขัด guarantee ตรง ๆguarantee ยังคงอยู่จริง — แยกด้วย เส้นทาง ไม่ใช่แค่ decision record
อ่านย้อนจาก trail แยกสองเคสนี้ออกได้โดยไม่ต้องเปิด decision record · มี check ใน
simulation/e2e_flow.pyที่ replay ทั้งสอง flow แล้วพิสูจน์ว่าเส้นทางต่างกันจริงการเพิ่ม edge ทำให้
DRAFTเข้าได้สองทาง และมีทางเดียวที่เป็นคำตัดสิน:GOVERNANCE_ANALYSIS → DRAFTREJECTED → DRAFTDECISION_BY_TARGET(map จาก ปลายทาง) จึงตอบผิดทันที — จะไปบังคับให้REJECTED → DRAFTต้องมี authority และทำให้ replay ปฏิเสธ trail ที่ถูกต้องสมบูรณ์
ไม่ได้ใส่ข้อยกเว้นให้ผ่าน แต่เปลี่ยน key เป็น edge →
DECISION_BY_EDGE+decision_for_edge()ใช้ทั้งฝั่ง engine และ replay · และ ลบ
DECISION_BY_TARGETทิ้ง ไม่ทิ้งไว้คู่กันเพื่อให้โค้ดที่ยังอ่านแบบเก่า import ไม่ผ่าน แทนที่จะอ่านคำตอบผิดเงียบ ๆ
· บันทึกไว้ทั้งใน Consequences และ Risk ของ RFC
ผลตรวจ
pytestpayload_check.pysimulation/e2e_flow.pycheck ใน
payload_checkที่เคยยืนยันว่าREQUIRE_CHANGESถูกปฏิเสธ กลับด้านเป็นยืนยันว่ามัน พา job ไป
DRAFT· ล้าง approval ทิ้ง · ข้ามREJECTEDและ payloaddecision: REQUIRE_CHANGESถูก validate กับapproval/v1ในฐานะสิ่งที่ engine ผลิตจริงที่รักษาไว้
states.pyยังเป็นที่เดียวที่ประกาศ transition · direction lock ·expires_at·APPROVEDtimeout (#17) ไม่ถูกแตะ — มีเทสเฉพาะยืนยันว่า edge ใหม่ไม่เปิดทางเข้า execution
·
semantics_versionยัง1.1UnmappedDecisionเก็บไว้ พร้อมคำอธิบายว่าใช้เมื่อไหร่ — ตอนนี้ไม่มีใครยิง แต่เป็น backstopของ decision type ที่ 4 ในอนาคตที่ประกาศค่าโดยไม่ประกาศปลายทาง ถ้าลบทิ้งจะกลายเป็น
KeyErrorกลางเครื่องยนต์แทนการปฏิเสธที่อ่านออก · มีเทสยิงมันจริง
Follow-up ที่ยังไม่ทำ
RFC-0010 ทิ้ง Future Work ไว้ว่าควรมี conformance check ที่เทียบ
contract-semantics.yamlกับ
states.pyตรง ๆ — PR นี้ยืนยันด้วยมือแล้วว่าตรง แต่ยังไม่มี check ถาวร