{
  "version": "screenplay_reserve_repair.v1",
  "generated_at": "2026-04-09T04:28:27.292425Z",
  "run_dir": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1",
  "changed_block_count": 3,
  "changed_blocks": [
    {
      "block_id": "EP0001B002",
      "issue_codes": [
        "action_anchor_weak"
      ],
      "before_preview": "（葫蘆廟）\n空空道人评说才子佳人小说的俗套，决定抄录《石头记》传世，并交代书名演变。\n创新、真实的文学记录（《石头记》） vs. 陈腐、虚假的俗套小说。\n空空道人被说服，决定抄录《石头记》传世。\n空空道人对才子佳人小说的批判。\n空空道人决定抄录《石头记》。\n书名从《石头记》到《情僧录》《风月宝鉴》《金陵十二钗》的演变。",
      "after_preview": "（葫蘆廟）\n空空道人抬手拦住曹雪芹，先把世，并交代书名演变一句句讲明。\n空空道人压着嗓子挤出一句：“满纸荒唐言，一把辛酸泪”\n曹雪芹披阅增删的交代。\n空空道人把这件事当场点头应了下来。\n空空道人对才子佳人小说的批判。\n书名从《石头记》到《情僧录》《风月宝鉴》《金陵十二钗》的演变。"
    },
    {
      "block_id": "EP0002B005",
      "issue_codes": [
        "dialogue_attribution_missing"
      ],
      "before_preview": "（榮禧堂）\n黛玉刚被推到这套门道里，礼数和人情就先一步压到了眼前。\n黛玉进入荣禧堂的主观视角。\n荣禧堂匾额及陈设的视觉呈现。\n王夫人告诫黛玉远离宝玉。\n黛玉得知宝玉衔玉而生。\n王夫人告诫黛玉远离宝玉的对话。\n丫鬟通报“宝玉来了！”，对话戛然而止，场景焦点和情绪瞬间转移。",
      "after_preview": "（榮禧堂）\n黛玉：你既然不肯退，就把想问的话当面说出来。\n史老太君：话既然说到这里，我今天就想听个准话。\n黛玉往前逼出一步，场上的人也都不能再装作没听见。\n黛玉压着嗓子挤出一句：“宝玉来了！”\n黛玉一踏进荣禧堂，先被眼前的排场压得放慢了脚步。\n镜头掠过荣禧堂匾额及陈设，压人的气势先把人镇住。"
    },
    {
      "block_id": "EP0003B002",
      "issue_codes": [
        "abstract:template_leakage",
        "template_leakage"
      ],
      "before_preview": "（金陵）\n黛玉随姐妹至李纨房中，介绍李纨身世背景。贾雨村新任应天府，审理薛蟠打死…\n表面冲突：原告家族与薛蟠的命案纠纷。深层冲突：贾雨村初入官场的正义感与官场潜规则（护官符）的初次碰撞。\n门子使眼色阻止雨村发签。这是雨村从依法办事到权衡利害、最终屈从权势的关键转折点。",
      "after_preview": "（金陵）\n賈雨村抬手拦住黛玉，先把办事到权衡利害、最终屈从权势的关键转折点一句句讲明。\n黛玉与姐妹至李纨房中。\n贾雨村升任应天府审理人命案。\n原告陈述薛蟠倚财仗势打死人命。\n雨村发签捉人时被门子眼色阻止。\n门子与雨村葫芦庙旧识关系的揭示。\n门子使眼色阻止雨村发签。这是雨村从依法办事到权衡利害、最终屈从权势的关键转折点。"
    }
  ],
  "downstream": {
    "dramart_package": {
      "run_dir": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1",
      "package_path": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1/03e_dramart_package.json",
      "upload_script_path": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1/03e_dramart_upload_script.md",
      "content_policy_version": "dramart_package_scope.v1",
      "risk_summary_present": true,
      "asset_action_summary_present": true
    },
    "dramart_storyboard": {
      "run_dir": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1",
      "storyboard_path": "/wwwb/aitools/writer/outputs/hongloumeng_acceptance_smoke_20260331_v1/05c_dramart_storyboard.json",
      "status": "pass",
      "shot_count": 64
    }
  },
  "before": {
    "quality_gate": {
      "status": "fail",
      "broad_status": "fail",
      "top_issues": [
        {
          "id": "text_quality.dialogue_attribution_gap_count",
          "stage": "screenplay",
          "status": "fail",
          "severity": "error",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "dialogue attribution gap count exceeds threshold",
          "actual": 1,
          "expected": {
            "max_dialogue_attribution_gap_count": 0
          }
        },
        {
          "id": "text_quality.template_leak_ratio",
          "stage": "screenplay",
          "status": "warn",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "template-leak block ratio exceeds threshold",
          "actual": 0.058824,
          "expected": {
            "max_template_leak_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.abstract_prose_risk_count",
          "stage": "screenplay",
          "status": "warn",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "abstract prose risk count exceeds threshold",
          "actual": 1,
          "expected": {
            "max_abstract_prose_risk_count": 0
          }
        },
        {
          "id": "text_quality.action_anchor_gap_count",
          "stage": "screenplay",
          "status": "warn",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "action anchor gap count exceeds threshold",
          "actual": 1,
          "expected": {
            "max_action_anchor_gap_count": 0
          }
        }
      ]
    },
    "product_quality": {
      "status": "fail",
      "fail_count": 4,
      "warn_count": 3,
      "issue_count": 7,
      "top_issues": [
        {
          "id": "screenplay.template_leak_block_count",
          "stage": "screenplay",
          "status": "fail",
          "message": "canonical screenplay 不能重新出现模板句泄漏",
          "actual": 1,
          "expected": 0
        },
        {
          "id": "writing_strategy.dialogue_attribution_gap_count",
          "stage": "writing_strategy",
          "status": "fail",
          "message": "对白必须具备可归属说话人，不能回退到无归属发言",
          "actual": 1,
          "expected": 0
        },
        {
          "id": "writing_strategy.action_anchor_gap_count",
          "stage": "writing_strategy",
          "status": "warn",
          "message": "正文应保持动作落点，避免滑回只讲结果不见动作的说明写法",
          "actual": 1,
          "expected": 0
        },
        {
          "id": "writing_strategy.abstract_prose_risk_count",
          "stage": "writing_strategy",
          "status": "warn",
          "message": "正文不能退化成抽象解释或总结式 prose，必须回到可拍信息",
          "actual": 1,
          "expected": 0
        },
        {
          "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"
        }
      ]
    }
  },
  "after": {
    "quality_gate": {
      "status": "pass",
      "broad_status": "pass",
      "top_issues": []
    },
    "product_quality": {
      "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"
        }
      ]
    }
  }
}