{
  "status": "producer_closed_v3_pre_freeze",
  "timeline": [
    {
      "day": "D-7",
      "beats": [
        2,
        3,
        4
      ],
      "events": "thư mời, Cảnh Hoài trở về, họp kín"
    },
    {
      "day": "D-5",
      "beats": [
        5,
        6,
        7
      ],
      "events": "gặp Minh Châu, chụp ảnh/catch-up, Tú Mai biết tin đồn"
    },
    {
      "day": "D-4",
      "beats": [
        8,
        9
      ],
      "events": "thông cáo chính thức, Cảnh Hoài nhận cam kết ba tháng"
    },
    {
      "day": "D-3",
      "beats": [
        10,
        11,
        12
      ],
      "events": "báo cáo, từ chối bồi thường, Minh Châu thấy chuỗi phê duyệt"
    },
    {
      "day": "D-2",
      "beats": [
        13,
        14,
        15
      ],
      "events": "hai mẹ gặp, sai lầm có giá, điều kiện chỉ thuộc quyền An Nhiên"
    },
    {
      "day": "D-1",
      "beats": [
        16,
        17,
        18
      ],
      "events": "hủy lời mời, Cảnh Hoài giữ lịch rời đi, Minh Châu nhận phần trách nhiệm"
    },
    {
      "day": "D0",
      "beats": [
        19,
        20,
        21,
        22
      ],
      "events": "tiệc, lời nhận trách nhiệm, lựa chọn và hậu quả trực tiếp"
    },
    {
      "day": "D+1 to D+90",
      "beats": [
        23,
        24
      ],
      "events": "ba tháng xa nhau, buổi hẹn đầu tiên và epilogue"
    }
  ],
  "knowledge": [
    {
      "fact": "An Nhiên và Minh Châu bị trao nhầm do sơ tán bệnh viện",
      "audience": "seed beat 2; full beat 10",
      "An Nhiên": "biết trao nhầm beat 2, biết nguyên nhân/report beat 10",
      "Minh Châu": "biết trao nhầm trước beat 5, biết full report khi hai mẹ gặp beat 13",
      "Tú Mai": "biết DNA trước truyện, biết report beat 13",
      "Hạ family": "cha/mẹ/Tuấn Thành/bà biết full trước beat 2",
      "Cảnh Hoài": "biết theo An Nhiên beat 3"
    },
    {
      "fact": "Thông cáo xóa tên là lựa chọn gia đình",
      "audience": "thấy hậu quả beat 8, full chain beat 12, public accountability beat 20",
      "An Nhiên": "biết nội dung beat 8, biết chain approval beat 12",
      "Minh Châu": "thấy track changes và nhận phần mình beat 12",
      "Hạ family": "Tuấn Thành soạn, Đình Sơn duyệt, Uyển Dung và bà nội đọc/im lặng"
    }
  ],
  "relationship": [
    {
      "beat": 2,
      "before": "An Nhiên và Hạ family chưa có quan hệ sống",
      "turn": "lời mời có điều kiện",
      "after": "huyết thống bị biến thành giao dịch"
    },
    {
      "beat": 6,
      "before": "Cảnh Hoài là người nhà/anh trai mặc định",
      "turn": "An Nhiên yêu cầu đứng cạnh nhưng không như anh trai",
      "after": "ranh giới lãng mạn được mở nhưng chưa xác nhận"
    },
    {
      "beat": 10,
      "before": "An Nhiên còn hy vọng mẹ ruột bị động",
      "turn": "biết mẹ đã chọn trì hoãn tám tháng",
      "after": "niềm tin sụp, trách nhiệm rõ"
    },
    {
      "beat": 13,
      "before": "hai người mẹ bị đặt như đối thủ",
      "turn": "cả hai từ chối trao đổi con",
      "after": "mô hình gia đình không thay thế"
    },
    {
      "beat": 20,
      "before": "hai cô gái cạnh tranh danh phận",
      "turn": "Minh Châu tự gọi đúng quan hệ",
      "after": "khả năng làm chị em mở ra"
    },
    {
      "beat": 23,
      "before": "Cảnh Hoài/An Nhiên ở ranh giới người nhà",
      "turn": "anh hỏi hẹn, cô chủ động nhận",
      "after": "quan hệ tình yêu bắt đầu rõ ràng"
    }
  ],
  "props": [
    {
      "prop": "chiếc ghế gỗ thứ bảy",
      "origin": "Cảnh Hoài đóng từ bàn học cũ khi quán chè thiếu chỗ lúc hai người mười sáu tuổi",
      "first_appearance": 1,
      "surface_meaning": "ghế thừa trong khung ảnh",
      "custody": "quán chè → được mượn tới buổi chụp → trả về quán",
      "payoff": "không còn là ghế xin thuộc về; An Nhiên chủ động mời người ngồi cạnh"
    },
    {
      "prop": "báo cáo sự cố bệnh viện",
      "origin": "hồ sơ điều tra về sơ tán ngày sinh",
      "first_appearance": 10,
      "meaning": "xác nhận tai nạn và Tú Mai vô tội",
      "custody": "Uyển Dung giữ bản sao; bản công khai do An Nhiên/Tú Mai đồng ý",
      "payoff": "đính chính, không tự tạo tình yêu hay gia đình"
    },
    {
      "prop": "bức ảnh gia đình",
      "origin": "buổi chụp trước tiệc",
      "first_appearance": 1,
      "meaning": "ai được nhìn nhận công khai",
      "payoff": "ảnh cuối không dùng để giả hòa giải; chỉ lưu như bằng chứng lựa chọn ở beat 21"
    },
    {
      "prop": "bảy bát chè hạt sen",
      "origin": "Tú Mai nấu theo thói quen ngõ Thanh Chi",
      "first_appearance": 13,
      "meaning": "có chỗ cho nhiều quan hệ, không phải thay thế",
      "payoff": "echo ở beat 24"
    }
  ],
  "reward_beats": [
    {
      "beat": 3,
      "type": "recognition"
    },
    {
      "beat": 6,
      "type": "agency"
    },
    {
      "beat": 9,
      "type": "romantic"
    },
    {
      "beat": 11,
      "type": "agency"
    },
    {
      "beat": 13,
      "type": "truth/domestic"
    },
    {
      "beat": 17,
      "type": "delegation"
    },
    {
      "beat": 20,
      "type": "status/truth"
    },
    {
      "beat": 21,
      "type": "justice/agency"
    },
    {
      "beat": 23,
      "type": "romantic"
    },
    {
      "beat": 24,
      "type": "domestic"
    }
  ],
  "continuity_invariants": [
    "Tú Mai không biết báo cáo full trước beat 13",
    "Minh Châu không biết full chain phê duyệt trước beat 12",
    "Cảnh Hoài không phát ngôn thay An Nhiên và không hủy cam kết ba tháng để cứu hộ",
    "An Nhiên không nhận tiền/cổ phần làm payoff",
    "An Nhiên không dùng báo cáo/danh dự Tú Mai tại climax khi mẹ rút consent",
    "buổi chụp teaser/catch-up cùng exact state",
    "nghề nghiệp không giải quyết family engine",
    "tiệc xảy ra D0, first date chỉ D+90"
  ],
  "locked_at": "2026-07-21T12:57:26.082896+00:00",
  "draft_parts": [
    {
      "part": 1,
      "beats": [
        1,
        2,
        3,
        4,
        5,
        6
      ]
    },
    {
      "part": 2,
      "beats": [
        7,
        8,
        9,
        10,
        11,
        12
      ]
    },
    {
      "part": 3,
      "beats": [
        13,
        14,
        15,
        16,
        17,
        18
      ]
    },
    {
      "part": 4,
      "beats": [
        19,
        20,
        21,
        22,
        23,
        24
      ]
    }
  ],
  "draft_progress": [
    {
      "part": 1,
      "status": "closed_v3",
      "beats": [
        1,
        2,
        3,
        4,
        5,
        6
      ],
      "word_count": 3304,
      "sha256": "cc4519b52bdf4574caf2b2646e3c35f0b41802ac52967d8a3e438b61c5739ec8",
      "verified": true,
      "closed_at": "2026-07-21T13:34:44.468902+00:00"
    },
    {
      "part": 2,
      "status": "closed_v3",
      "beats": [
        7,
        8,
        9,
        10,
        11,
        12
      ],
      "word_count": 2139,
      "sha256": "5c4c6c2a85d2e9872aebe2531f7d38c97413d0fc828784f98ab8b554f7152087",
      "verified": true,
      "closed_at": "2026-07-21T13:34:44.468902+00:00"
    },
    {
      "part": 3,
      "status": "closed_v3",
      "beats": [
        13,
        14,
        15,
        16,
        17,
        18
      ],
      "word_count": 2031,
      "sha256": "2b5669bcd8fd767063e395c8a9e76eaa6c1cbd14fe2b373edb900d240ac96149",
      "verified": true,
      "closed_at": "2026-07-21T13:34:44.468902+00:00"
    },
    {
      "part": 4,
      "status": "closed_v3",
      "beats": [
        19,
        20,
        21,
        22,
        23,
        24
      ],
      "word_count": 2734,
      "sha256": "debc854670b09bef5136adcaeb2929bfbc2c946b38d971f9c717ba1c7e590f6d",
      "verified": true,
      "closed_at": "2026-07-21T13:34:44.468902+00:00"
    }
  ],
  "draft_aggregate": {
    "path": "work/story/run-001/candidate.txt",
    "revision": "v3",
    "status": "producer_closed",
    "assembly_verified": true,
    "word_count": 10208,
    "byte_count": 63064,
    "sha256": "8800d03d32afee35d03f59afc0cd998b58a2353feefc437960f35f268bafdaab",
    "predicted_duration_minutes": 44.19047619047619,
    "part_sha256": [
      "cc4519b52bdf4574caf2b2646e3c35f0b41802ac52967d8a3e438b61c5739ec8",
      "5c4c6c2a85d2e9872aebe2531f7d38c97413d0fc828784f98ab8b554f7152087",
      "2b5669bcd8fd767063e395c8a9e76eaa6c1cbd14fe2b373edb900d240ac96149",
      "debc854670b09bef5136adcaeb2929bfbc2c946b38d971f9c717ba1c7e590f6d"
    ],
    "closed_at": "2026-07-21T13:37:59.684115+00:00",
    "assembly_contract": "exact part bytes in order with one blank line between parts and one final newline"
  },
  "revisions": [
    {
      "revision": "v2",
      "status": "completed",
      "scope": "dialogue pacing only; split five long continuous turns with reaction/action beats",
      "story_changes": {
        "premise": false,
        "pov": false,
        "characters": false,
        "trope": false,
        "twist": false,
        "story_engine": false,
        "ending": false
      },
      "reason": "viet-truyen dialogue listening guidance: one main idea per turn, avoid overlong sentences, provide TTS breathing points",
      "affected_parts": [
        2,
        3,
        4
      ],
      "candidate_v1_sha256": "fe4c41e41199655c77ef6255cd5756eb4037ed03a34e58fb17110e74a089f7c9",
      "recorded_before_edit": true,
      "created_at": "2026-07-21T13:07:24.583119+00:00",
      "candidate_v2_sha256": "3402ec16fe61389ca6bb6a04552ccaa00dda1894bd06d821b780e7aea893f23f",
      "candidate_v2_words": 10281,
      "candidate_v2_bytes": 63279,
      "validation_verified": true,
      "completed_at": "2026-07-21T13:08:34.823696+00:00"
    },
    {
      "revision": "v3",
      "status": "producer_closed_pending_audit",
      "recorded_before_edit": true,
      "source_blocker_receipt": "log/run-001/audit-v2-blocked.json",
      "scope": [
        "chronology",
        "causal architecture",
        "distributed consequences",
        "protagonist mistake consequence",
        "male lead reciprocal cost",
        "authority ending alignment"
      ],
      "story_changes": {
        "premise": false,
        "pov": false,
        "characters": false,
        "trope": false,
        "story_family": false,
        "ending_image": false
      },
      "created_at": "2026-07-21T13:29:12.685926+00:00",
      "candidate_v3_sha256": "8800d03d32afee35d03f59afc0cd998b58a2353feefc437960f35f268bafdaab",
      "candidate_v3_words": 10208,
      "full_read_completed": true,
      "full_read_line_count": 1219,
      "v2_blockers_remediated": true
    }
  ],
  "frozen_candidate_sha256": "3402ec16fe61389ca6bb6a04552ccaa00dda1894bd06d821b780e7aea893f23f",
  "full_read_lines": 1145,
  "full_read_verified": true,
  "frozen_at": "2026-07-21T13:09:51.821829+00:00"
}
