{
  "meta": {
    "contract_version": "screenplay_review_state.v1",
    "issue_taxonomy_version": "screenplay_review_issue_taxonomy.v1",
    "source_screenplay_path": "03d_screenplay.json",
    "generated_at": "2026-04-01T03:31:41Z",
    "last_event_at": "2026-04-01T03:31:41Z"
  },
  "taxonomy": {
    "version": "screenplay_review_issue_taxonomy.v1",
    "issues": [
      {
        "label": "continuity_issue",
        "display_name": "承接问题",
        "description": "相邻 block 或 episode 之间的人物、地点、冲突或行动目标承接不稳定。",
        "severity": "high",
        "priority": 90,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "continuity_guard",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 continuity guard、承接锚点和相邻 block 的压缩写法。"
      },
      {
        "label": "bad_episode_boundary",
        "display_name": "分集边界问题",
        "description": "分集切点不稳，导致 hook、尾钩或集内负载分配失衡。",
        "severity": "high",
        "priority": 85,
        "preferred_scopes": [
          "episode",
          "run"
        ],
        "followup_targets": [
          "episode_split",
          "episode_rebalance",
          "issue_regression"
        ],
        "recommendation": "优先回看 episode split、thin-tail rebalance 与 hook 组织策略。"
      },
      {
        "label": "summary_tone",
        "display_name": "摘要腔偏重",
        "description": "段落信息虽然完整，但正文仍像概述、结构说明或骨架改写，不像直接可演的场面。",
        "severity": "medium",
        "priority": 72,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "screenplay_fallback",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 fallback 正文生成、开场入戏顺序和可表演锚点保留策略，避免把 must_keep/conflict 写成解释性概述。"
      },
      {
        "label": "weak_dialogue",
        "display_name": "对白偏弱",
        "description": "对白机会明显的段落被写成摘要、旁白或缺少可表演的对话往来。",
        "severity": "medium",
        "priority": 70,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "dialogue_guard",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 dialogue guard、对白机会判定和 block 内的对白保留策略。"
      }
    ]
  },
  "summary": {
    "run_review_status": "accepted",
    "episodes": {
      "total": 3,
      "unreviewed": 0,
      "accepted": 3,
      "needs_rewrite": 0,
      "open": 0
    },
    "blocks": {
      "total": 15,
      "unreviewed": 0,
      "accepted": 15,
      "needs_rewrite": 0,
      "open": 0
    },
    "issue_counts": {
      "bad_episode_boundary": 0,
      "continuity_issue": 0,
      "summary_tone": 0,
      "weak_dialogue": 0
    },
    "issue_summary": [
      {
        "label": "continuity_issue",
        "display_name": "承接问题",
        "description": "相邻 block 或 episode 之间的人物、地点、冲突或行动目标承接不稳定。",
        "severity": "high",
        "priority": 90,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "continuity_guard",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 continuity guard、承接锚点和相邻 block 的压缩写法。",
        "counts": {
          "run": 0,
          "episode": 0,
          "block": 0,
          "total": 0
        },
        "present": false
      },
      {
        "label": "bad_episode_boundary",
        "display_name": "分集边界问题",
        "description": "分集切点不稳，导致 hook、尾钩或集内负载分配失衡。",
        "severity": "high",
        "priority": 85,
        "preferred_scopes": [
          "episode",
          "run"
        ],
        "followup_targets": [
          "episode_split",
          "episode_rebalance",
          "issue_regression"
        ],
        "recommendation": "优先回看 episode split、thin-tail rebalance 与 hook 组织策略。",
        "counts": {
          "run": 0,
          "episode": 0,
          "block": 0,
          "total": 0
        },
        "present": false
      },
      {
        "label": "summary_tone",
        "display_name": "摘要腔偏重",
        "description": "段落信息虽然完整，但正文仍像概述、结构说明或骨架改写，不像直接可演的场面。",
        "severity": "medium",
        "priority": 72,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "screenplay_fallback",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 fallback 正文生成、开场入戏顺序和可表演锚点保留策略，避免把 must_keep/conflict 写成解释性概述。",
        "counts": {
          "run": 0,
          "episode": 0,
          "block": 0,
          "total": 0
        },
        "present": false
      },
      {
        "label": "weak_dialogue",
        "display_name": "对白偏弱",
        "description": "对白机会明显的段落被写成摘要、旁白或缺少可表演的对话往来。",
        "severity": "medium",
        "priority": 70,
        "preferred_scopes": [
          "block",
          "episode",
          "run"
        ],
        "followup_targets": [
          "dialogue_guard",
          "screenplay_prompt_contract",
          "issue_regression"
        ],
        "recommendation": "优先回看 dialogue guard、对白机会判定和 block 内的对白保留策略。",
        "counts": {
          "run": 0,
          "episode": 0,
          "block": 0,
          "total": 0
        },
        "present": false
      }
    ],
    "event_count": 19
  },
  "run_review": {
    "target_id": "screenplay",
    "episode_count": 3,
    "block_count": 15,
    "status": "accepted",
    "labels": [],
    "reviewer": "codex",
    "review_note": "program-first summary-tone cleanup rerun accepted",
    "updated_at": "2026-04-01T03:31:41Z"
  },
  "episode_reviews": [
    {
      "episode_id": "EP0001",
      "episode_index": 1,
      "title": "第01集 祖师因悟空“少腮”的辩驳，意识…",
      "block_count": 6,
      "time_modes": [],
      "source_scene_ids": [
        "S0002",
        "S0004",
        "S0006",
        "S0007",
        "S0008",
        "S0009",
        "S0010",
        "S0011"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "episode_id": "EP0002",
      "episode_index": 2,
      "title": "第02集 宴饮间被勾魂至幽冥界",
      "block_count": 5,
      "time_modes": [],
      "source_scene_ids": [
        "S0012",
        "S0014",
        "S0015",
        "S0016",
        "S0017",
        "S0018"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "episode_id": "EP0003",
      "episode_index": 3,
      "title": "第03集 鬼王提议“齐天大圣”称号，悟空…",
      "block_count": 4,
      "time_modes": [],
      "source_scene_ids": [
        "S0020",
        "S0022",
        "S0023",
        "S0024",
        "S0025"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    }
  ],
  "block_reviews": [
    {
      "block_id": "EP0001B001",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "scene",
      "title": "诗曰混沌，盘古开天，天地演化，四大部洲，花果山…",
      "presentation_mode": "dramatize",
      "time_modes": [
        "unknown",
        "mainline"
      ],
      "source_scene_ids": [
        "S0002"
      ],
      "source_group_ids": [
        "AG0001"
      ],
      "source_beat_ids": [
        "AB0001"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0001B002",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "dialogue",
      "title": "美猴王享乐数百年后忽生对死亡的忧虑，通背猿猴点…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0004"
      ],
      "source_group_ids": [
        "AG0002"
      ],
      "source_beat_ids": [
        "AB0002"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0001B003",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "dialogue",
      "title": "樵夫解释歌词来源，述说家世不能修行。为猴王指明…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0006"
      ],
      "source_group_ids": [
        "AG0003"
      ],
      "source_beat_ids": [
        "AB0003"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0001B004",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "dialogue",
      "title": "猴王找到洞府，见景致非凡。洞门开处，仙童出来…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0007",
        "S0008"
      ],
      "source_group_ids": [
        "AG0004",
        "AG0005"
      ],
      "source_beat_ids": [
        "AB0004",
        "AB0005"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0001B005",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "dialogue",
      "title": "孙悟空在洞中修行数年后，听祖师讲道，因喜不自胜…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0009",
        "S0010"
      ],
      "source_group_ids": [
        "AG0006",
        "AG0007"
      ],
      "source_beat_ids": [
        "AB0006",
        "AB0007"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0001B006",
      "episode_id": "EP0001",
      "episode_index": 1,
      "kind": "dialogue",
      "title": "祖师告知悟空修炼长生之道需防备三灾利害。 悟空…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0011"
      ],
      "source_group_ids": [
        "AG0008"
      ],
      "source_beat_ids": [
        "AB0008"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0002B001",
      "episode_id": "EP0002",
      "episode_index": 2,
      "kind": "dialogue",
      "title": "悟空当众变化松树，喧哗惊动祖师，被逐出师门返回…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0012"
      ],
      "source_group_ids": [
        "AG0009"
      ],
      "source_beat_ids": [
        "AB0009"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0002B002",
      "episode_id": "EP0002",
      "episode_index": 2,
      "kind": "action",
      "title": "悟空与混世魔王对峙并展开激战。悟空使用身外身法…",
      "presentation_mode": "action",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0014"
      ],
      "source_group_ids": [
        "AG0010"
      ],
      "source_beat_ids": [
        "AB0010"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0002B003",
      "episode_id": "EP0002",
      "episode_index": 2,
      "kind": "dialogue",
      "title": "悟空带领猴群回到花果山，众猴设宴接风并称赞大王…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0015"
      ],
      "source_group_ids": [
        "AG0011"
      ],
      "source_beat_ids": [
        "AB0011"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0002B004",
      "episode_id": "EP0002",
      "episode_index": 2,
      "kind": "action",
      "title": "美猴王担忧兵器不足，听取老猴建议，驾云前往傲来…",
      "presentation_mode": "action",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0016",
        "S0017"
      ],
      "source_group_ids": [
        "AG0012",
        "AG0013"
      ],
      "source_beat_ids": [
        "AB0012",
        "AB0013"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0002B005",
      "episode_id": "EP0002",
      "episode_index": 2,
      "kind": "dialogue",
      "title": "悟空索要披挂，龙王擂鼓召来三海龙王，凑齐冠甲履…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline",
        "flashback"
      ],
      "source_scene_ids": [
        "S0018"
      ],
      "source_group_ids": [
        "AG0014"
      ],
      "source_beat_ids": [
        "AB0014"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0003B001",
      "episode_id": "EP0003",
      "episode_index": 3,
      "kind": "dialogue",
      "title": "孙悟空打死勾死人，打入森罗殿，强查生死簿，勾销…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0020"
      ],
      "source_group_ids": [
        "AG0015"
      ],
      "source_beat_ids": [
        "AB0015"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0003B002",
      "episode_id": "EP0003",
      "episode_index": 3,
      "kind": "dialogue",
      "title": "太白金星奉旨下界，到花果山水帘洞宣读招安圣旨…",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0022",
        "S0023"
      ],
      "source_group_ids": [
        "AG0016",
        "AG0017"
      ],
      "source_beat_ids": [
        "AB0016",
        "AB0017"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0003B003",
      "episode_id": "EP0003",
      "episode_index": 3,
      "kind": "dialogue",
      "title": "悟空得知弼马温官职低微，怒回花果山。",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0024"
      ],
      "source_group_ids": [
        "AG0018"
      ],
      "source_beat_ids": [
        "AB0018"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    },
    {
      "block_id": "EP0003B004",
      "episode_id": "EP0003",
      "episode_index": 3,
      "kind": "dialogue",
      "title": "独角鬼王献赭黄袍，提议悟空自称齐天大圣。",
      "presentation_mode": "dialogue",
      "time_modes": [
        "mainline"
      ],
      "source_scene_ids": [
        "S0025"
      ],
      "source_group_ids": [
        "AG0019"
      ],
      "source_beat_ids": [
        "AB0019"
      ],
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "updated_at": "2026-04-01T03:31:41Z"
    }
  ],
  "events": [
    {
      "event_id": "SRV00001",
      "scope": "run",
      "target_id": "screenplay",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "program-first summary-tone cleanup rerun accepted",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00002",
      "scope": "episode",
      "target_id": "EP0001",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00003",
      "scope": "block",
      "target_id": "EP0001B001",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00004",
      "scope": "block",
      "target_id": "EP0001B002",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00005",
      "scope": "block",
      "target_id": "EP0001B003",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00006",
      "scope": "block",
      "target_id": "EP0001B004",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00007",
      "scope": "block",
      "target_id": "EP0001B005",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00008",
      "scope": "block",
      "target_id": "EP0001B006",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00009",
      "scope": "episode",
      "target_id": "EP0002",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00010",
      "scope": "block",
      "target_id": "EP0002B001",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00011",
      "scope": "block",
      "target_id": "EP0002B002",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00012",
      "scope": "block",
      "target_id": "EP0002B003",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00013",
      "scope": "block",
      "target_id": "EP0002B004",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00014",
      "scope": "block",
      "target_id": "EP0002B005",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00015",
      "scope": "episode",
      "target_id": "EP0003",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "episode accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00016",
      "scope": "block",
      "target_id": "EP0003B001",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00017",
      "scope": "block",
      "target_id": "EP0003B002",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00018",
      "scope": "block",
      "target_id": "EP0003B003",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    },
    {
      "event_id": "SRV00019",
      "scope": "block",
      "target_id": "EP0003B004",
      "action": "updated",
      "status": "accepted",
      "labels": [],
      "reviewer": "codex",
      "review_note": "block accepted after summary-tone cleanup",
      "timestamp": "2026-04-01T03:31:41Z"
    }
  ]
}