Skip to content

event/v1: ไม่มี sequence ต่อ subject → trail ที่ถูกตัดท้ายอ่านได้เหมือนสมบูรณ์ #23

Description

@monthop-gmail

พบตอนทำ devfactory-core#7
(end-to-end simulation + replay) — audit trail ที่ถูกตัดท้ายตรวจไม่ได้ ยกเว้น job ที่จบด้วย
COMPLETED
และปิดช่องนี้จากฝั่ง consumer ไม่ได้ เพราะต้องแก้ที่ event/v1

กลไกที่ทำให้ตรวจไม่ได้

การ replay ตรวจความครบของ trail ด้วยการให้ record ถัดไปยืนยัน record ก่อนหน้า
STATE_TRANSITION ใบถัดไปบอกว่าออกจาก state ไหน ถ้าไม่ต่อกันแปลว่ามีใบหาย

แต่ ไม่มีอะไรยืนยันใบสุดท้าย · JOB_COMPLETED ช่วยได้เฉพาะ job ที่จบสวย ผลคือ:

job จบแบบ ถ้า event ท้ายสุดหายไป
COMPLETED ✅ จับได้ (JOB_COMPLETED เรียกหา transition ก่อนหน้า)
FAILED · CANCELLED · TIMED_OUT replay ผ่านเรียบร้อย โดยได้ state ก่อนหน้าใบที่หาย
ยังเดินอยู่ (ไม่ terminal) ❌ เหมือนกัน

แปลว่า trail ที่ถูกตัดท้ายอ่านได้เหมือน trail ที่สมบูรณ์ — ซึ่งเป็น failure mode ที่แย่ที่สุด
สำหรับ audit log: มันไม่ได้พังให้เห็น มันตอบผิดอย่างมั่นใจ

ทำไมฝั่ง consumer ปิดเองไม่ได้

ต้องมี per-job sequence number ติดมากับ event เพื่อให้เห็นว่า "ใบสุดท้ายที่ควรมีคือใบที่เท่าไหร่"
ซึ่งเป็น wire shape ของ event/v1 — ตาม RFC-0005 Rule 1 เป็นของท่าน ไม่ใช่ของเรา

เราไม่อยากยัด field เองแบบที่ทำกับ supersedes_decision_id ใน
#22 เพราะอันนั้นเป็น metadata
ของ record เดียว แต่อันนี้เป็น ความหมายของลำดับทั้ง trail ถ้าต่างคนต่างนิยาม replay ข้าม
consumer จะเชื่อกันไม่ได้เลย

ข้อเสนอ

เพิ่ม field ที่ producer ต้องเติมให้ต่อเนื่องต่อหนึ่ง subject:

  sequence:
    type: integer
    minimum: 1
    description: >-
      ลำดับของ event ภายใน subject เดียวกัน เริ่มที่ 1 และห้ามข้าม
      ผู้อ่าน trail ใช้ตรวจว่า "มีใบหายท้ายสุดไหม" ซึ่งเป็นสิ่งเดียวที่
      การไล่ from→to ตรวจไม่ได้

ประเด็นที่ต้องเคาะฝั่งท่าน: นับต่อ subject หรือต่อ tenant · producer หลายตัวต่อ subject
เดียวกันจะชนกันไหม (ของเราตอนนี้มีตัวเดียว) · เป็น required หรือ optional ในเวอร์ชันนี้

ฝั่งเราทำอะไรไปแล้ว

  • เพิ่ม IncompleteSettlement ปิดเท่าที่ปิดได้โดยไม่แตะสัญญา
  • เขียนข้อจำกัดไว้ใน docstring และ README ของ packages/observability
  • มีเทสชื่อ test_a_trail_cut_short_at_a_terminal_other_than_completed_still_replays
    ที่ยืนยันว่าตรวจไม่ได้
    — บันทึกช่องว่างไว้เป็นโค้ด จะได้ไม่หายไปกับความจำใคร
    (PR#19 merged)

พอ event/v1 มี sequence เมื่อไหร่ เราจะเปลี่ยนเทสตัวนั้นจาก "ยืนยันว่าตรวจไม่ได้"
เป็น "ยืนยันว่าตรวจได้" ครับ

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions