{
  "dataMode": "fixtures",
  "manifest": {
    "snapshotAt": "2026-10-07T17:31:33.982Z",
    "tabs": [
      {
        "tab": "baseline.csv",
        "sourceDigest": "b4a1e6db115ddf31dc432b3d46a9f18cb57c4785f1535d13babd7b04c5963bb0",
        "headerFingerprint": "0d5dbfb14eac78c1380929cdd627ade6531cfc1734b0daea8db4cd9d91d75c61",
        "rows": 2,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "budget.csv",
        "sourceDigest": "a5081875bd146356fc4e0e497c1f130a317000f68e0c3847e74cb291710f0844",
        "headerFingerprint": "1b47975af7951e08ad5e5025ab6e16eb9871428e222ad09b345f030ca52892e5",
        "rows": 4,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "groups.csv",
        "sourceDigest": "ee9f28ace77de3706d48fb377f7779dac8851c81b4949a701575d78af2ea4574",
        "headerFingerprint": "4d1168eb32cd15116bc9bfca6324af218fa7b862e5e06aa8428a6dca93b9b7d7",
        "rows": 3,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "requests.csv",
        "sourceDigest": "77146e7fb1f3e5354bad5509a7a030661209a11c0d6f7f69ec4ebb8819e9cb9d",
        "headerFingerprint": "a1d6cc124f84adfbb4953983c587143c122197c527aba12808dbd85e9ef3b6fd",
        "rows": 4,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "roster.csv",
        "sourceDigest": "2505b5d5a01a9fd0905213a209ef2c4566fbb8c207410b90cd11f82f60963877",
        "headerFingerprint": "f51813323cd1342faa2ef5d59c85b726d58107d4c27f7e36c6b1a6d1f971a4c5",
        "rows": 8,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "routes.csv",
        "sourceDigest": "7c28cf9b70efd93ca36d245c35723d413ec9fe2ee63923760dbe287670cf7844",
        "headerFingerprint": "d38141de24e5cc5b3238d8fae48868d41611929de6a9e685bbe9d02a3934e703",
        "rows": 2,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      },
      {
        "tab": "workplan.csv",
        "sourceDigest": "a4b160a33208bbc8be2819724e047ffa59f5a8a8adc881d396645095d35716e1",
        "headerFingerprint": "e9945d0aa5986b592878b42b2c33d19f14054fa773588e548b543e0212b9f474",
        "rows": 2,
        "fetchedAt": "2026-10-07T17:31:33.982Z"
      }
    ]
  },
  "summary": {
    "uniquePeople": 6,
    "teamAssignments": 7,
    "resolvedPeople": 6,
    "unresolvedCandidates": 1,
    "grainNote": "unique_people = ตัวตนที่ resolve ได้ · assignments = แถวสังกัดทีม (เกิน unique ได้)"
  },
  "matrix": {
    "reg": {
      "budget_request": {
        "state": "PROVIDED",
        "submission": {
          "submittedAt": "2026-10-05T03:10:00Z",
          "submittedByRole": "workstream_head"
        }
      },
      "work_plan": {
        "state": "PROVIDED",
        "submission": {
          "submittedAt": "2026-10-05T03:12:00Z",
          "submittedByRole": "workstream_head"
        }
      },
      "staff_roster": {
        "state": "UNKNOWN",
        "submission": null
      },
      "photos": {
        "state": "NOT_SUBMITTED",
        "submission": null
      }
    },
    "meal": {
      "budget_request": {
        "state": "UNKNOWN",
        "submission": null
      },
      "staff_roster": {
        "state": "PROVIDED",
        "submission": {
          "submittedAt": "2026-10-04T09:00:00Z",
          "submittedByRole": "team_lead"
        }
      }
    },
    "tent": {
      "budget_request": {
        "state": "NOT_SUBMITTED",
        "submission": null
      },
      "staff_roster": {
        "state": "PROVIDED",
        "submission": {
          "submittedAt": "2026-10-04T09:00:00Z",
          "submittedByRole": "team_lead"
        }
      }
    },
    "plan": {
      "budget_request": {
        "state": "UNKNOWN",
        "submission": {
          "submittedAt": "2026-10-06T02:00:00Z",
          "submittedByRole": "team_lead"
        }
      },
      "work_plan": {
        "state": "NOT_SUBMITTED",
        "submission": null
      }
    }
  },
  "openItems": [
    {
      "team": "reg",
      "input": "staff_roster",
      "state": "UNKNOWN",
      "owner": "reg",
      "due": "2026-10-18",
      "milestone": "รับ/กระทบยอดส่วนเพิ่ม",
      "daysLeft": 11,
      "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
    },
    {
      "team": "reg",
      "input": "photos",
      "state": "NOT_SUBMITTED",
      "owner": "reg",
      "due": "2026-10-31",
      "milestone": "ชื่อ+รูปส่งส่วนกลาง",
      "daysLeft": 24,
      "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
    },
    {
      "team": "meal",
      "input": "budget_request",
      "state": "UNKNOWN",
      "owner": "reg",
      "due": "2026-10-15",
      "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
      "daysLeft": 8,
      "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
    },
    {
      "team": "tent",
      "input": "budget_request",
      "state": "NOT_SUBMITTED",
      "owner": "reg",
      "due": "2026-10-15",
      "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
      "daysLeft": 8,
      "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
    },
    {
      "team": "plan",
      "input": "budget_request",
      "state": "UNKNOWN",
      "owner": "reg",
      "due": "2026-10-15",
      "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
      "daysLeft": 8,
      "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
    },
    {
      "team": "plan",
      "input": "work_plan",
      "state": "NOT_SUBMITTED",
      "owner": "reg",
      "due": "2026-10-15",
      "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
      "daysLeft": 8,
      "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
    }
  ],
  "blocked": {
    "reg|package_15oct_budget": {
      "status": "BLOCKED",
      "blockedBy": [
        {
          "team": "meal",
          "input": "budget_request",
          "state": "UNKNOWN",
          "note": "แพ็กงบ 15 ต.ค. รองบของทีมอาหาร",
          "chain": "meal.budget_request=UNKNOWN → reg.package_15oct_budget BLOCKED"
        },
        {
          "team": "tent",
          "input": "budget_request",
          "state": "NOT_SUBMITTED",
          "note": "แพ็กงบ 15 ต.ค. รองบของทีมเต็นท์",
          "chain": "tent.budget_request=NOT_SUBMITTED → reg.package_15oct_budget BLOCKED"
        },
        {
          "team": "plan",
          "input": "budget_request",
          "state": "UNKNOWN",
          "note": "",
          "chain": "plan.budget_request=UNKNOWN → reg.package_15oct_budget BLOCKED"
        }
      ]
    },
    "meal|meal_prep": {
      "status": "BLOCKED",
      "blockedBy": [
        {
          "team": "reg",
          "input": "staff_roster",
          "state": "UNKNOWN",
          "note": "",
          "chain": "reg.staff_roster=UNKNOWN → meal.meal_prep BLOCKED"
        }
      ]
    },
    "tent|tent_prep": {
      "status": "BLOCKED",
      "blockedBy": [
        {
          "team": "reg",
          "input": "staff_roster",
          "state": "UNKNOWN",
          "note": "",
          "chain": "reg.staff_roster=UNKNOWN → tent.tent_prep BLOCKED"
        }
      ]
    }
  },
  "planning": {
    "planningBaseline": {
      "revision": "rev-2",
      "notifiedCount": 700,
      "asOf": "2026-09-27T14:00:00Z",
      "source": "central_office",
      "label": "ESTIMATE",
      "note": "ตัวเลขรวมสำหรับวางแผนจากส่วนกลาง — ไม่ใช่รายชื่อ ไม่ใช่ยอดมาจริง"
    },
    "baselineRevisionsPreserved": [
      "rev-1",
      "rev-2"
    ],
    "rosterCoverage": {
      "resolvedPeople": 6,
      "deltaFromBaseline": 694,
      "note": "delta = ตัวเลขวางแผน − ตัวตนที่ resolve ได้ใน snapshot นี้ (รายละเอียดจริงยังมาไม่ครบตามธรรมชาติของรอบ)"
    },
    "estimateRule": "ยอดประมาณการของทีม (มื้อ/เต็นท์/ฐาน) ที่คำนวณจาก baseline ต้องติดป้าย ESTIMATE เสมอ"
  },
  "packs": {
    "registration": {
      "pack": "Registration Control",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z",
        "tabs": [
          {
            "tab": "baseline.csv",
            "sourceDigest": "b4a1e6db115ddf31dc432b3d46a9f18cb57c4785f1535d13babd7b04c5963bb0",
            "headerFingerprint": "0d5dbfb14eac78c1380929cdd627ade6531cfc1734b0daea8db4cd9d91d75c61",
            "rows": 2,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "budget.csv",
            "sourceDigest": "a5081875bd146356fc4e0e497c1f130a317000f68e0c3847e74cb291710f0844",
            "headerFingerprint": "1b47975af7951e08ad5e5025ab6e16eb9871428e222ad09b345f030ca52892e5",
            "rows": 4,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "groups.csv",
            "sourceDigest": "ee9f28ace77de3706d48fb377f7779dac8851c81b4949a701575d78af2ea4574",
            "headerFingerprint": "4d1168eb32cd15116bc9bfca6324af218fa7b862e5e06aa8428a6dca93b9b7d7",
            "rows": 3,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "requests.csv",
            "sourceDigest": "77146e7fb1f3e5354bad5509a7a030661209a11c0d6f7f69ec4ebb8819e9cb9d",
            "headerFingerprint": "a1d6cc124f84adfbb4953983c587143c122197c527aba12808dbd85e9ef3b6fd",
            "rows": 4,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "roster.csv",
            "sourceDigest": "2505b5d5a01a9fd0905213a209ef2c4566fbb8c207410b90cd11f82f60963877",
            "headerFingerprint": "f51813323cd1342faa2ef5d59c85b726d58107d4c27f7e36c6b1a6d1f971a4c5",
            "rows": 8,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "routes.csv",
            "sourceDigest": "7c28cf9b70efd93ca36d245c35723d413ec9fe2ee63923760dbe287670cf7844",
            "headerFingerprint": "d38141de24e5cc5b3238d8fae48868d41611929de6a9e685bbe9d02a3934e703",
            "rows": 2,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          },
          {
            "tab": "workplan.csv",
            "sourceDigest": "a4b160a33208bbc8be2819724e047ffa59f5a8a8adc881d396645095d35716e1",
            "headerFingerprint": "e9945d0aa5986b592878b42b2c33d19f14054fa773588e548b543e0212b9f474",
            "rows": 2,
            "fetchedAt": "2026-10-07T17:31:33.982Z"
          }
        ]
      },
      "submissions": {
        "reg": {
          "budget_request": "PROVIDED",
          "work_plan": "PROVIDED",
          "staff_roster": "UNKNOWN",
          "photos": "NOT_SUBMITTED"
        },
        "meal": {
          "budget_request": "UNKNOWN",
          "staff_roster": "PROVIDED"
        },
        "tent": {
          "budget_request": "NOT_SUBMITTED",
          "staff_roster": "PROVIDED"
        },
        "plan": {
          "budget_request": "UNKNOWN",
          "work_plan": "NOT_SUBMITTED"
        }
      },
      "followUps": [
        {
          "team": "reg",
          "input": "staff_roster",
          "state": "UNKNOWN",
          "owner": "reg",
          "due": "2026-10-18",
          "milestone": "รับ/กระทบยอดส่วนเพิ่ม",
          "daysLeft": 11,
          "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
        },
        {
          "team": "reg",
          "input": "photos",
          "state": "NOT_SUBMITTED",
          "owner": "reg",
          "due": "2026-10-31",
          "milestone": "ชื่อ+รูปส่งส่วนกลาง",
          "daysLeft": 24,
          "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
        },
        {
          "team": "meal",
          "input": "budget_request",
          "state": "UNKNOWN",
          "owner": "reg",
          "due": "2026-10-15",
          "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
          "daysLeft": 8,
          "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
        },
        {
          "team": "tent",
          "input": "budget_request",
          "state": "NOT_SUBMITTED",
          "owner": "reg",
          "due": "2026-10-15",
          "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
          "daysLeft": 8,
          "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
        },
        {
          "team": "plan",
          "input": "budget_request",
          "state": "UNKNOWN",
          "owner": "reg",
          "due": "2026-10-15",
          "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
          "daysLeft": 8,
          "why": "ค่าในชีตยังเชื่อไม่ได้ (ช่องว่าง/ศูนย์โดยยังไม่ submit หรือส่งแล้วไม่มีข้อมูล) — ต้องยืนยันจากทีม"
        },
        {
          "team": "plan",
          "input": "work_plan",
          "state": "NOT_SUBMITTED",
          "owner": "reg",
          "due": "2026-10-15",
          "milestone": "คณะกรรมการ + ยื่นงบส่วนกลาง",
          "daysLeft": 8,
          "why": "ไม่มีหลักฐานการส่งเลย — ต้องติดตามก่อนถือเป็นศูนย์"
        }
      ],
      "counts": {
        "uniquePeople": 6,
        "teamAssignments": 7,
        "resolvedPeople": 6,
        "unresolvedCandidates": 1,
        "grainNote": "unique_people = ตัวตนที่ resolve ได้ · assignments = แถวสังกัดทีม (เกิน unique ได้)"
      },
      "entitlements": {
        "uniquePeople": 6,
        "shirt": 6,
        "badge": 6,
        "routing": {
          "primaryTeam": "UNRESOLVED",
          "note": "แหล่งไม่มีคอลัมน์ primary team — ห้ามอนุมาน (seq 88) · จัดส่งผ่านทีมใดต้องรอเจ้าของงานตั้ง"
        }
      },
      "photoReadiness": {
        "reg": {
          "ready": 1,
          "total": 2,
          "missingRefs": [
            "R-002"
          ]
        },
        "meal": {
          "ready": 1,
          "total": 2,
          "missingRefs": [
            "R-007"
          ]
        },
        "tent": {
          "ready": 2,
          "total": 2,
          "missingRefs": []
        },
        "reg-institute": {
          "ready": 0,
          "total": 1,
          "missingRefs": [
            "R-101"
          ]
        }
      }
    },
    "budget": {
      "pack": "Budget Coordination",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z",
        "tab": {
          "tab": "budget.csv",
          "sourceDigest": "a5081875bd146356fc4e0e497c1f130a317000f68e0c3847e74cb291710f0844",
          "headerFingerprint": "1b47975af7951e08ad5e5025ab6e16eb9871428e222ad09b345f030ca52892e5",
          "rows": 4,
          "fetchedAt": "2026-10-07T17:31:33.982Z"
        }
      },
      "byCommand": {
        "field_exam": {
          "rows": [
            {
              "teamId": "reg",
              "teamName": "ทะเบียนควบคุมสนาม",
              "budgetOwner": "reg",
              "item": "อุปกรณ์สำนักงาน",
              "qty": "2",
              "amount": 1200,
              "state": "requested",
              "sourceRowRef": "budget.csv#row2"
            },
            {
              "teamId": "meal",
              "teamName": "อาหาร",
              "budgetOwner": "meal",
              "item": "ค่าจัดเตรียมอาหาร",
              "qty": "1",
              "amount": 800,
              "state": "estimate",
              "sourceRowRef": "budget.csv#row3"
            }
          ]
        },
        "institute": {
          "rows": [
            {
              "teamId": "reg-institute",
              "teamName": "ทะเบียนฝ่ายสถาบัน",
              "budgetOwner": "reg-institute",
              "item": "ค่าเดินทางสถาบัน",
              "qty": "1",
              "amount": 500,
              "state": "requested",
              "sourceRowRef": "budget.csv#row4"
            }
          ]
        }
      },
      "totals": {
        "field_exam": {
          "byState": {
            "requested": 1200,
            "estimate": 800
          },
          "note": "รวมแยกตาม state ภายในสายบัญชาการเดียว — ห้ามบวกข้าม state และห้ามยกรวมข้ามสายโดยไม่ติดป้าย"
        },
        "institute": {
          "byState": {
            "requested": 500
          },
          "note": "รวมแยกตาม state ภายในสายบัญชาการเดียว — ห้ามบวกข้าม state และห้ามยกรวมข้ามสายโดยไม่ติดป้าย"
        }
      },
      "fifteenOctPackage": {
        "completeness": "ยังไม่ครบ",
        "blockedBy": [
          {
            "team": "meal",
            "input": "budget_request",
            "state": "UNKNOWN",
            "note": "แพ็กงบ 15 ต.ค. รองบของทีมอาหาร",
            "chain": "meal.budget_request=UNKNOWN → reg.package_15oct_budget BLOCKED"
          },
          {
            "team": "tent",
            "input": "budget_request",
            "state": "NOT_SUBMITTED",
            "note": "แพ็กงบ 15 ต.ค. รองบของทีมเต็นท์",
            "chain": "tent.budget_request=NOT_SUBMITTED → reg.package_15oct_budget BLOCKED"
          },
          {
            "team": "plan",
            "input": "budget_request",
            "state": "UNKNOWN",
            "note": "",
            "chain": "plan.budget_request=UNKNOWN → reg.package_15oct_budget BLOCKED"
          }
        ],
        "note": "แพ็กนี้คือมุมมองความครบของการยื่นขออนุมัติ — ไม่ใช่การอนุมัติงบ ไม่แตะบัญชี/จัดซื้อ (G3)"
      },
      "unmatchedRows": [
        {
          "sourceRowRef": "budget.csv#row5",
          "file": "691_workbook",
          "tab": "budget",
          "section": "field_command",
          "label": "ทีมไม่รู้จัก",
          "kind": "UNKNOWN_LABEL"
        }
      ]
    },
    "groupMentor": {
      "pack": "Group / Mentor",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z",
        "tab": {
          "tab": "groups.csv",
          "sourceDigest": "ee9f28ace77de3706d48fb377f7779dac8851c81b4949a701575d78af2ea4574",
          "headerFingerprint": "4d1168eb32cd15116bc9bfca6324af218fa7b862e5e06aa8428a6dca93b9b7d7",
          "rows": 3,
          "fetchedAt": "2026-10-07T17:31:33.982Z"
        }
      },
      "groupsWithoutMentor": [
        {
          "code": "G-02",
          "route": "B",
          "mentorRef": null
        }
      ],
      "groups": 2,
      "lowerBaseDuty": [
        {
          "station": "lower_base",
          "mentorRef": "M-002",
          "sourceRowRef": "groups.csv#M-002"
        }
      ],
      "unresolvedIdentity": {
        "candidates": 1,
        "note": "ตัวตนที่ resolve ไม่ได้ต้องคนยืนยัน ไม่เดา (T2)"
      },
      "note": "mentor->group คนละแกนกับ station duty · กลุ่มพระเป็นกลุ่มจริง ห้ามอนุมานจากเลข/สมณเพศ"
    },
    "meal": {
      "pack": "Meal",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z"
      },
      "grain": "person × day × meal × service_class — คนหนึ่งนับครั้งเดียวต่อมื้อ",
      "rosterDerived": {
        "byServiceClassMeals": {
          "monk": 12,
          "regular": 60,
          "vegetarian": 0,
          "unknown": 0
        },
        "totalMeals": 72,
        "label": "ROSTER-DERIVED — จากตัวตนที่ resolve ได้ ณ snapshot นี้ (ยังไม่ใช่ ACTUAL)",
        "note": "พระ/หมวดพิเศษนับตาม service class ไม่ใช่ทีม (seq 89) · คนหนึ่งนับมื้อครั้งเดียวต่อมื้อ"
      },
      "baselineEstimate": {
        "revision": "rev-2",
        "notifiedCount": 700,
        "asOf": "2026-09-27T14:00:00Z",
        "source": "central_office",
        "label": "ESTIMATE",
        "note": "ประมาณการรวมจากตัวเลขส่วนกลาง — ใช้วางแผนก่อนรายชื่อมา",
        "totalMeals": 8400
      },
      "rule": "ชีไม่รับมื้อเย็น/หมวดพระ เป็น config ต่อรอบ ไม่ใช่ if ในโค้ด (แพทเทิร์น MealCategory ของ thudong)"
    },
    "tent": {
      "pack": "Tent",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z"
      },
      "grain": "คนที่แจ้ง needs_tent / จำนวนคนต่อเต็นท์ — ฐานต่างจากอาหาร",
      "rosterDerived": {
        "needsTent": 2,
        "tents": 1,
        "personsPerTent": 2,
        "label": "ROSTER-DERIVED — นับเฉพาะคนที่แจ้ง · ฐานไม่เท่ากับยอดอาหาร"
      },
      "baselineEstimate": {
        "revision": "rev-2",
        "asOf": "2026-09-27T14:00:00Z",
        "tents": null,
        "label": "UNKNOWN",
        "note": "baseline aggregate ไม่มีสัดส่วน needs_tent — ห้ามเดาจากยอดรวม ต้องรอ roster หรืออัตราส่วนที่เจ้าของงานยืนยัน"
      }
    },
    "movement": {
      "pack": "Movement / Route",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z",
        "tab": {
          "tab": "routes.csv",
          "sourceDigest": "7c28cf9b70efd93ca36d245c35723d413ec9fe2ee63923760dbe287670cf7844",
          "headerFingerprint": "d38141de24e5cc5b3238d8fae48868d41611929de6a9e685bbe9d02a3934e703",
          "rows": 2,
          "fetchedAt": "2026-10-07T17:31:33.982Z"
        }
      },
      "targetDate": "2026-11-26",
      "scheduledForDate": [
        {
          "group": "G-01",
          "route": "A",
          "sourceRowRef": "routes.csv#G-01#2026-11-26"
        }
      ],
      "unknownForDate": [
        "G-02"
      ],
      "groupsSource": "groups tab",
      "rule": "ตารางสายรายวัน — วันที่ไม่มีแถว = ยังไม่รู้ ห้ามใช้สายประจำแทน (กฎ default_route_id ของ thudong)"
    },
    "siteDemand": {
      "pack": "Site Demand",
      "provenance": {
        "snapshotAt": "2026-10-07T17:31:33.982Z",
        "tab": {
          "tab": "requests.csv",
          "sourceDigest": "77146e7fb1f3e5354bad5509a7a030661209a11c0d6f7f69ec4ebb8819e9cb9d",
          "headerFingerprint": "a1d6cc124f84adfbb4953983c587143c122197c527aba12808dbd85e9ef3b6fd",
          "rows": 4,
          "fetchedAt": "2026-10-07T17:31:33.982Z"
        }
      },
      "byItem": {
        "เต็นท์ 3 คน": {
          "requestedQty": 10,
          "state": "requested",
          "teams": [
            "tent"
          ]
        },
        "โต๊ะกลุ่ม": {
          "requestedQty": 20,
          "state": "requested",
          "teams": [
            "meal"
          ]
        },
        "เก้าอี้ประชุม": {
          "requestedQty": 30,
          "state": "requested",
          "teams": [
            "reg-institute"
          ]
        },
        "เต็นท์ครัว": {
          "requestedQty": 2,
          "state": "requested",
          "teams": [
            "meal"
          ]
        }
      },
      "unmatchedRows": [],
      "note": "requested ≠ approved ≠ received ≠ distributed — สถานะต่อไปยังไม่มีใน source จึงไม่ถูกตีความ"
    }
  },
  "aliasFails": []
}