{
  "version": "screenplay_product_quality.v1",
  "generated_at": "2026-04-08T20:05:45.067787Z",
  "meta": {
    "run_dir": "/wwwb/aitools/writer/outputs/adaptation_round2_script_smoke_20260328_v1",
    "source_paths": {
      "screenplay": "03d_screenplay.json",
      "dramart_package": "03e_dramart_package.json",
      "prompt_guard": "05b_storyboard_guard.json"
    },
    "thresholds": {
      "screenplay": {
        "max_multi_scene_source_block_count": 0,
        "max_multi_time_mode_block_count": 0,
        "max_special_label_missing_block_count": 0,
        "max_scene_element_stacking_block_count": 0,
        "max_purity_warn_block_count": 1,
        "max_fallback_placeholder_block_count": 0,
        "max_template_leak_block_count": 0,
        "max_summary_tone_block_count": 0,
        "max_chronicle_tone_block_count": 0,
        "max_weak_performable_tension_block_count": 0,
        "max_delayed_scene_entry_block_count": 0,
        "max_event_bundle_summary_block_count": 0,
        "max_excerpt_summary_lead_block_count": 0,
        "max_expository_voiceover_lead_block_count": 0,
        "max_adaptation_meta_leakage_block_count": 0
      },
      "writing_strategy": {
        "max_subject_anchor_gap_count": 0,
        "max_dialogue_attribution_gap_count": 0,
        "max_action_anchor_gap_count": 0,
        "max_location_anchor_gap_count": 0,
        "max_abstract_prose_risk_count": 0
      },
      "dramart_upload": {
        "min_upload_script_char_count": 600,
        "max_semi_structured_line_ratio_warn": 0.18,
        "max_semi_structured_line_ratio_fail": 0.35
      },
      "prompt_guard": {
        "require_text_quality_status": "pass",
        "require_tri_layer_status": "pass",
        "require_dramart_delivery_status": "pass"
      },
      "spot_check": {
        "risk_block_limit": 4,
        "normal_block_limit": 2
      }
    }
  },
  "screenplay": {
    "episode_count": 1,
    "block_count": 3,
    "blocked_block_count": 0,
    "purity_warn_block_count": 0,
    "overlong_block_count": 0,
    "multi_scene_source_block_count": 0,
    "multi_time_mode_block_count": 0,
    "special_label_missing_block_count": 0,
    "scene_element_stacking_block_count": 0,
    "flashback_tag_block_count": 0,
    "montage_tag_block_count": 0,
    "template_leak_block_count": 0,
    "fallback_placeholder_block_count": 0,
    "summary_tone_block_count": 0,
    "chronicle_tone_block_count": 0,
    "weak_performable_tension_block_count": 0,
    "delayed_scene_entry_block_count": 0,
    "adaptation_meta_leakage_block_count": 0,
    "event_bundle_summary_block_count": 0,
    "excerpt_summary_lead_block_count": 0,
    "expository_voiceover_lead_block_count": 0,
    "risk_blocks": [],
    "normal_blocks": [
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B001",
        "title": "墨竹凶山，魔尊法坛",
        "lead_scene_id": "S0001",
        "presentation_mode": "dramatize",
        "time_modes": [
          "unknown"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "【墨竹山 外 日】\n\n△ 远景。两山十四峰险峻连绵，墨色的竹林如海，在风中发出呜咽般的声响。瘴气如纱，在林间缓缓流动。\n\n△ 镜头推进，穿过竹林。隐约可见妖兽的轮廓在雾中一闪而过。\n\n△ 最终，画面定格在一片林间空地。这里显然经过人力开凿，平整得不自然。空地中央，矗立着一座诡异的石制法坛。\n\n△ 法坛之上，是一尊八臂六首的魔尊雕像，面目狰狞，俯瞰着这片蛮荒…"
      },
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B002",
        "title": "童子入门，夜规森严",
        "lead_scene_id": "S0002",
        "presentation_mode": "dialogue",
        "time_modes": [
          "mainline",
          "flashback"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "【瑶光洞前 外 日】\n\n△ 三名身着道袍的修士，领着七八个面色惶恐的童子走来。为首修士向等候在此的一位邋遢老道行礼。\n\n修士甲：人带来了。都是按规矩挑的，有灵根的，有道心的，还有……疑似身怀魔胎的。\n\n△ 老道眯着眼，扫视众童子，目光在李凡（混在童子中，穿着不合时宜的现代睡衣）身上略微停顿。\n\n修士乙（低声补充）：玉蟾婆那边吃紧，这些是好不容易“剩”下的。…"
      }
    ]
  },
  "writing_strategy": {
    "status": "pass",
    "block_count": 3,
    "pass_block_count": 3,
    "warn_block_count": 0,
    "fail_block_count": 0,
    "subject_anchor_gap_count": 0,
    "dialogue_attribution_gap_count": 0,
    "action_anchor_gap_count": 0,
    "location_anchor_gap_count": 0,
    "abstract_prose_risk_count": 0,
    "next_fix_focus": []
  },
  "dramart_upload": {
    "platform_status": "unknown",
    "upload_ready": false,
    "asset_ready": false,
    "storyboard_ready": "unknown",
    "upload_script_char_count": 1895,
    "upload_script_line_count": 56,
    "semi_structured_line_count": 0,
    "semi_structured_line_ratio": 0.0,
    "status": "pass",
    "semi_structured_line_samples": [],
    "upload_script_preview": "# 道祖是克苏鲁\n\n## 故事大纲\n故事核心：穿越者李凡在险恶的墨竹山醒来，被迫参与残酷的童子试炼，并激活了一个看似无用、甚至反噬的“心理健康维护系统”。\n核心钩子：险峰叠嶂，毒瘴弥漫。镜头穿过墨林竹海，推至一片突兀的人造平地——八臂六首的魔尊法相森然矗立，无声诉说着此地的凶险与秘密。\n\n## 主要人物\n- 李凡：主要角色\n- 老道：修道之人\n- 修士：角色姓名\n- 童子：功能角色\n\n## 分集导览\n- 第01集 魔尊法坛：穿越者李凡在险恶的墨竹山醒来，被迫参与残酷的童子试炼，并激活了一个看似无用、甚至反噬的“心…"
  },
  "prompt_guard": {
    "shot_count": 14,
    "issue_count": 0,
    "delivery_fix_queue_size": 0,
    "text_quality_acceptance_status": "pass",
    "tri_layer_acceptance_status": "pass",
    "dramart_delivery_acceptance_status": "pass"
  },
  "spot_check": {
    "risk_blocks": [],
    "normal_blocks": [
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B001",
        "title": "墨竹凶山，魔尊法坛",
        "lead_scene_id": "S0001",
        "presentation_mode": "dramatize",
        "time_modes": [
          "unknown"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "【墨竹山 外 日】\n\n△ 远景。两山十四峰险峻连绵，墨色的竹林如海，在风中发出呜咽般的声响。瘴气如纱，在林间缓缓流动。\n\n△ 镜头推进，穿过竹林。隐约可见妖兽的轮廓在雾中一闪而过。\n\n△ 最终，画面定格在一片林间空地。这里显然经过人力开凿，平整得不自然。空地中央，矗立着一座诡异的石制法坛。\n\n△ 法坛之上，是一尊八臂六首的魔尊雕像，面目狰狞，俯瞰着这片蛮荒…"
      },
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B002",
        "title": "童子入门，夜规森严",
        "lead_scene_id": "S0002",
        "presentation_mode": "dialogue",
        "time_modes": [
          "mainline",
          "flashback"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "【瑶光洞前 外 日】\n\n△ 三名身着道袍的修士，领着七八个面色惶恐的童子走来。为首修士向等候在此的一位邋遢老道行礼。\n\n修士甲：人带来了。都是按规矩挑的，有灵根的，有道心的，还有……疑似身怀魔胎的。\n\n△ 老道眯着眼，扫视众童子，目光在李凡（混在童子中，穿着不合时宜的现代睡衣）身上略微停顿。\n\n修士乙（低声补充）：玉蟾婆那边吃紧，这些是好不容易“剩”下的。…"
      }
    ],
    "recommended_manual_sample_count": 2
  },
  "summary": {
    "status": "pass",
    "fail_count": 0,
    "warn_count": 0,
    "issue_count": 0,
    "top_issues": []
  },
  "checks": [
    {
      "id": "artifacts.screenplay",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "screenplay 工件必须存在",
      "actual": true,
      "expected": true
    },
    {
      "id": "artifacts.dramart_package",
      "stage": "dramart_upload",
      "status": "pass",
      "severity": "info",
      "message": "dramart_upload 工件必须存在",
      "actual": true,
      "expected": true
    },
    {
      "id": "artifacts.prompt_guard",
      "stage": "prompt_guard",
      "status": "pass",
      "severity": "info",
      "message": "prompt_guard 工件必须存在",
      "actual": true,
      "expected": true
    },
    {
      "id": "screenplay.multi_scene_source_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "screenplay block 必须保持单场景来源纯度",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.multi_time_mode_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "screenplay block 不得混装多个时间模式",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.special_label_missing_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "特殊时间/表现块必须显式标记 flashback / montage 等标签",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.scene_element_stacking_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "screenplay block 开头不能把多个场景元素硬堆在一起，导致场面失焦",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.purity_warn_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "screenplay purity warn block 数必须保持在冻结阈值内",
      "actual": 0,
      "expected": 1
    },
    {
      "id": "screenplay.fallback_placeholder_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "canonical screenplay 不能重新出现 fallback placeholder 正文污染",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.template_leak_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "canonical screenplay 不能重新出现模板句泄漏",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.summary_tone_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "canonical screenplay 不能重新滑回摘要式概述正文",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.chronicle_tone_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "canonical screenplay 不能重新滑回章回/编年串讲口吻",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.weak_performable_tension_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "高人物密度 block 不能只剩抽象压力总结，必须落回可表演张力",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.delayed_scene_entry_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "正文开头不能先承接前场或长句过桥，真正场面入点必须尽快出现",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.event_bundle_summary_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "多个事件不能被打包成流程说明书式梗概，必须保留可拍现场",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.excerpt_summary_lead_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "正文首句不能退化成摘录式概述导语",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.expository_voiceover_lead_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "正文起笔不能退化成全知说明式旁白导语",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "screenplay.adaptation_meta_leakage_block_count",
      "stage": "screenplay",
      "status": "pass",
      "severity": "info",
      "message": "adaptation 元信息不能泄漏到最终 screenplay 正文",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "writing_strategy.subject_anchor_gap_count",
      "stage": "writing_strategy",
      "status": "pass",
      "severity": "info",
      "message": "正文必须保留清晰主体锚点，不能退化到只剩无主体描述",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "writing_strategy.dialogue_attribution_gap_count",
      "stage": "writing_strategy",
      "status": "pass",
      "severity": "info",
      "message": "对白必须具备可归属说话人，不能回退到无归属发言",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "writing_strategy.action_anchor_gap_count",
      "stage": "writing_strategy",
      "status": "pass",
      "severity": "info",
      "message": "正文应保持动作落点，避免滑回只讲结果不见动作的说明写法",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "writing_strategy.location_anchor_gap_count",
      "stage": "writing_strategy",
      "status": "pass",
      "severity": "info",
      "message": "正文应保留可见空间锚点，避免场面悬空",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "writing_strategy.abstract_prose_risk_count",
      "stage": "writing_strategy",
      "status": "pass",
      "severity": "info",
      "message": "正文不能退化成抽象解释或总结式 prose，必须回到可拍信息",
      "actual": 0,
      "expected": 0
    },
    {
      "id": "dramart_upload.upload_script_char_count",
      "stage": "dramart_upload",
      "status": "pass",
      "severity": "info",
      "message": "Dramart 上传正文不能短到失去分集可读性",
      "actual": 1895,
      "expected": 600
    },
    {
      "id": "dramart_upload.semi_structured_line_ratio",
      "stage": "dramart_upload",
      "status": "pass",
      "severity": "info",
      "message": "Dramart 上传正文不能滑回半结构化说明书写法",
      "actual": 0.0,
      "expected": {
        "warn_at": 0.18,
        "fail_at": 0.35
      }
    },
    {
      "id": "prompt_guard.text_quality_status",
      "stage": "prompt_guard",
      "status": "pass",
      "severity": "info",
      "message": "prompt_guard 必须保持 text_quality 为 pass",
      "actual": "pass",
      "expected": "pass"
    },
    {
      "id": "prompt_guard.tri_layer_status",
      "stage": "prompt_guard",
      "status": "pass",
      "severity": "info",
      "message": "prompt_guard 必须保持 tri_layer 为 pass",
      "actual": "pass",
      "expected": "pass"
    },
    {
      "id": "prompt_guard.dramart_delivery_status",
      "stage": "prompt_guard",
      "status": "pass",
      "severity": "info",
      "message": "prompt_guard 必须保持 dramart_delivery 为 pass",
      "actual": "pass",
      "expected": "pass"
    }
  ]
}