{
  "version": "screenplay_product_quality.v1",
  "generated_at": "2026-04-08T20:05:45.123561Z",
  "meta": {
    "run_dir": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_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": 3,
    "block_count": 14,
    "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": "exposition",
        "time_modes": [
          "mainline"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "（旁白起，画面呈现混沌初开，女娲补天之景）\n作者自云，曾历一番梦幻，故将真事隐去，借“假语村言”敷演出一段故事。\n\n女娲氏炼石补天，于大荒山无稽崖练成顽石三万六千五百零一块，单单剩了一块未用，弃在青埂峰下。\n\n（特写：顽石自经锻炼，灵性已通，日夜悲号惭愧）\n一日，一僧一道远远而来，谈笑风生。\n\n顽石（石上显出字迹，心声）：大师！弟子蠢物，见礼了。适闻二位谈…"
      },
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B002",
        "title": "空空道人传书",
        "lead_scene_id": "S0004",
        "presentation_mode": "exposition",
        "time_modes": [
          "mainline"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "（承接上回，空空道人持书卷下山）\n空空道人（独白）：因空见色，由色生情，传情入色，自色悟空。这《石头记》从此便由我传了。后因曹雪芹先生于悼红轩中披阅十载，增删五次，纂成目录，分出章回，又题曰《金陵十二钗》。\n\n（画面叠印书名演变：《情僧录》、《风月宝鉴》、《金陵十二钗》）\n空空道人（继续）：满纸荒唐言，一把辛酸泪。都云作者痴，谁解其中味？\n\n（镜头从书卷上…"
      }
    ]
  },
  "writing_strategy": {
    "status": "pass",
    "block_count": 14,
    "pass_block_count": 14,
    "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": 16561,
    "upload_script_line_count": 426,
    "semi_structured_line_count": 41,
    "semi_structured_line_ratio": 0.096244,
    "status": "pass",
    "semi_structured_line_samples": [
      "人物：賈雨村、一僧一道、女媧氏、甄士隱、空空道人",
      "场景：大荒山無稽崖、青埂峰",
      "转场：从神话时空，转入人间姑苏。",
      "人物：空空道人、甄士隱、封氏、曹雪芹",
      "场景：葫蘆廟、姑蘇、閶門、金陵"
    ],
    "upload_script_preview": "# hongloumeng_pg24264_ch1_4\n\n## 故事大纲\n故事核心：女娲补天遗石通灵，向往红尘富贵；甄士隐梦中得见“还泪”因果，慷慨资助贾雨村，却家破人亡，最终彻悟出家。\n核心钩子：一块被遗弃的顽石，为何苦苦哀求僧道带它去那‘花柳繁华地，温柔富贵乡’？\n\n## 主要人物\n- 賈雨村：修行者\n- 黛玉：核心角色\n- 王氏：核心角色\n- 賈寶玉：核心角色\n- 一僧一道：丰神迥异\n- 史老太君：主要角色\n- 甄士隱：主要角色\n- 公差：核心角色\n\n## 分集导览\n- 第一集 顽石入世 甄府兴衰：女娲补天…"
  },
  "prompt_guard": {
    "shot_count": 64,
    "issue_count": 17,
    "delivery_fix_queue_size": 12,
    "text_quality_acceptance_status": "fail",
    "tri_layer_acceptance_status": "warning",
    "dramart_delivery_acceptance_status": "fail"
  },
  "spot_check": {
    "risk_blocks": [],
    "normal_blocks": [
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B001",
        "title": "顽石求入红尘",
        "lead_scene_id": "S0001",
        "presentation_mode": "exposition",
        "time_modes": [
          "mainline"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "（旁白起，画面呈现混沌初开，女娲补天之景）\n作者自云，曾历一番梦幻，故将真事隐去，借“假语村言”敷演出一段故事。\n\n女娲氏炼石补天，于大荒山无稽崖练成顽石三万六千五百零一块，单单剩了一块未用，弃在青埂峰下。\n\n（特写：顽石自经锻炼，灵性已通，日夜悲号惭愧）\n一日，一僧一道远远而来，谈笑风生。\n\n顽石（石上显出字迹，心声）：大师！弟子蠢物，见礼了。适闻二位谈…"
      },
      {
        "episode_id": "EP0001",
        "block_id": "EP0001B002",
        "title": "空空道人传书",
        "lead_scene_id": "S0004",
        "presentation_mode": "exposition",
        "time_modes": [
          "mainline"
        ],
        "reason_count": 0,
        "reasons": [],
        "screenplay_preview": "（承接上回，空空道人持书卷下山）\n空空道人（独白）：因空见色，由色生情，传情入色，自色悟空。这《石头记》从此便由我传了。后因曹雪芹先生于悼红轩中披阅十载，增删五次，纂成目录，分出章回，又题曰《金陵十二钗》。\n\n（画面叠印书名演变：《情僧录》、《风月宝鉴》、《金陵十二钗》）\n空空道人（继续）：满纸荒唐言，一把辛酸泪。都云作者痴，谁解其中味？\n\n（镜头从书卷上…"
      }
    ],
    "recommended_manual_sample_count": 2
  },
  "summary": {
    "status": "fail",
    "fail_count": 2,
    "warn_count": 1,
    "issue_count": 3,
    "top_issues": [
      {
        "id": "prompt_guard.text_quality_status",
        "stage": "prompt_guard",
        "status": "fail",
        "message": "prompt_guard 必须保持 text_quality 为 pass",
        "actual": "fail",
        "expected": "pass"
      },
      {
        "id": "prompt_guard.tri_layer_status",
        "stage": "prompt_guard",
        "status": "warn",
        "message": "prompt_guard 必须保持 tri_layer 为 pass",
        "actual": "warning",
        "expected": "pass"
      },
      {
        "id": "prompt_guard.dramart_delivery_status",
        "stage": "prompt_guard",
        "status": "fail",
        "message": "prompt_guard 必须保持 dramart_delivery 为 pass",
        "actual": "fail",
        "expected": "pass"
      }
    ]
  },
  "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": 16561,
      "expected": 600
    },
    {
      "id": "dramart_upload.semi_structured_line_ratio",
      "stage": "dramart_upload",
      "status": "pass",
      "severity": "info",
      "message": "Dramart 上传正文不能滑回半结构化说明书写法",
      "actual": 0.096244,
      "expected": {
        "warn_at": 0.18,
        "fail_at": 0.35
      }
    },
    {
      "id": "prompt_guard.text_quality_status",
      "stage": "prompt_guard",
      "status": "fail",
      "severity": "error",
      "message": "prompt_guard 必须保持 text_quality 为 pass",
      "actual": "fail",
      "expected": "pass"
    },
    {
      "id": "prompt_guard.tri_layer_status",
      "stage": "prompt_guard",
      "status": "warn",
      "severity": "warn",
      "message": "prompt_guard 必须保持 tri_layer 为 pass",
      "actual": "warning",
      "expected": "pass"
    },
    {
      "id": "prompt_guard.dramart_delivery_status",
      "stage": "prompt_guard",
      "status": "fail",
      "severity": "error",
      "message": "prompt_guard 必须保持 dramart_delivery 为 pass",
      "actual": "fail",
      "expected": "pass"
    }
  ]
}