{
  "version": "screenplay_reserve_repair.v1",
  "generated_at": "2026-04-09T04:28:26.261505Z",
  "run_dir": "/wwwb/aitools/writer/outputs/daozu_conflict_downstream_trim8_20260329_v1",
  "changed_block_count": 5,
  "changed_blocks": [
    {
      "block_id": "EP0001B001",
      "issue_codes": [
        "adaptation_meta_leakage"
      ],
      "before_preview": "（墨竹山）\n险恶自然环境与人力痕迹/人造物的对立。\n人力开凿平地的非自然感。\n魔尊法相（八臂六首，非人型）的视觉呈现。\n镜头从险恶自然环境全景，推至人力开凿的平地，最终定格在诡异魔尊法相上。\n有人先把相（八臂六首，非人型）的视觉呈现一句句讲明。\n险恶自然环境与人力痕迹/人造物的对立；神秘、未知（法相）与可理解现实的对立。",
      "after_preview": "（墨竹山）\n人力开凿平地的非自然感。\n镜头掠过魔尊法相（八臂六首，非人型），压人的气势先把人镇住。\n有人先把相（八臂六首，非人型）的视觉呈现一句句讲明。\n镜头从险恶自然环境全景，推至人力开凿的平地，最终定格在诡异魔尊法相上。\n险恶自然环境与人力痕迹/人造物的对立；神秘、未知（法相）与可理解现实的对立。"
    },
    {
      "block_id": "EP0002B001",
      "issue_codes": [
        "abstract:abstract_performable_prose"
      ],
      "before_preview": "李凡的主观意愿（想吐槽发泄）与系统规则（吐槽导致心情下降）之间的内在冲突。\n李凡往前逼出一步，场上的人也都不能再装作没听见。\n李凡对系统的口头吐槽。\n系统两次心情下降的提示。\n李凡躺下查看心情值的动作。\n李凡从站着吐槽到躺下查看心情值。\n最终心情值97/100的显示。",
      "after_preview": "李凡往前逼出一步，场上的人也都不能再装作没听见。\n李凡对系统的口头吐槽。\n系统两次心情下降的提示。\n李凡躺下查看心情值的动作。\n最终心情值97/100的显示。\n李凡从站着吐槽到躺下查看心情值。\n李凡的主观意愿（想吐槽发泄）与系统规则（吐槽导致心情下降）之间的内在冲突。"
    },
    {
      "block_id": "EP0002B003",
      "issue_codes": [
        "dialogue_attribution_missing",
        "adaptation_meta_leakage"
      ],
      "before_preview": "（墨色竹林）\n李凡吐槽系统不送十连，心情下降，抽奖充能进度增加。\n主角的现代游戏玩家期望（开局十连）与系统吝啬现实之间的认知冲突。\n系统提示“抽奖功能暂不可用，当前充能进度，9/100”，将主角的吐槽情绪转化为对具体规则的认知。\n李凡吐槽系统不送十连。\n心情下降1点。\n抽奖充能进度9/100。",
      "after_preview": "（墨色竹林）\n李凡：你既然不肯退，就把想问的话当面说出来。\n李凡往前逼出一步，场上的人也都不能再装作没听见。\n系统提示音突然响起：“抽奖功能暂不可用，当前充能进度，9/100”\n李凡吐槽系统不送十连。\n李凡压着嗓子挤出一句：“抽奖功能暂不可用，当前充能进度，9/100”"
    },
    {
      "block_id": "EP0002B005",
      "issue_codes": [
        "action_anchor_weak"
      ],
      "before_preview": "李凡的生存危机（心情值濒危） vs. 外部未知干预（老道骇人现身）\n李凡把话追到眼前这层险关上，场上的人都被这股压力逼得屏住了气。\n老道突然出现。\n老道站在人堆里，脸色一下子就绷住了。\n心情值停止下降的系统提示。\n老道骇人形象的出现，强行中断了李凡心情值的下降趋势。",
      "after_preview": "李凡把话追到眼前这层险关上，场上的人都被这股压力逼得屏住了气。\n心情值停止下降的系统提示。\n老道突然出现。\n老道站在人堆里，脸色一下子就绷住了。\n老道骇人形象的出现，强行中断了李凡心情值的下降趋势。\n李凡的生存危机（心情值濒危） vs. 外部未知干预（老道骇人现身）\n创造一个极具冲击力的惊吓转折点。"
    },
    {
      "block_id": "EP0002B006",
      "issue_codes": [
        "adaptation_meta_leakage"
      ],
      "before_preview": "老道：这层险处不是嘴上说说，真落到身上，躲不过就要伤身。\n李凡：我只想知道，真到眼前时，这层险处到底该怎么躲？\n李凡结巴惊慌的回应。\n系统警报停止的视觉/听觉提示。\n李凡结巴的否认（“什什什么看到什么……”）标志着他选择隐瞒所见。\n老道因恐惧/未知而爆发的失控质问 vs. 李凡因穿越者身份和系统异常而产生的本能隐瞒与自保。",
      "after_preview": "老道：这层险处不是嘴上说说，真落到身上，躲不过就要伤身。\n李凡：我只想知道，真到眼前时，这层险处到底该怎么躲？\n老道抬头盯住李凡，非要把的具体动作（喷血沫）问个明白。\n李凡被逼得一怔，开口时连声音都打了结。\n系统提示音突然响起：“什什什么看到什么……”\n李凡猛地逼近一步，连喷血沫都带了出来。"
    }
  ],
  "downstream": {
    "dramart_package": {
      "run_dir": "/wwwb/aitools/writer/outputs/daozu_conflict_downstream_trim8_20260329_v1",
      "package_path": "/wwwb/aitools/writer/outputs/daozu_conflict_downstream_trim8_20260329_v1/03e_dramart_package.json",
      "upload_script_path": "/wwwb/aitools/writer/outputs/daozu_conflict_downstream_trim8_20260329_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/daozu_conflict_downstream_trim8_20260329_v1",
      "storyboard_path": "/wwwb/aitools/writer/outputs/daozu_conflict_downstream_trim8_20260329_v1/05c_dramart_storyboard.json",
      "status": "skipped"
    }
  },
  "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.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": 3,
      "warn_count": 3,
      "issue_count": 6,
      "top_issues": [
        {
          "id": "artifacts.prompt_guard",
          "stage": "prompt_guard",
          "status": "fail",
          "message": "prompt_guard 工件必须存在",
          "actual": false,
          "expected": true
        },
        {
          "id": "screenplay.purity_warn_block_count",
          "stage": "screenplay",
          "status": "warn",
          "message": "screenplay purity warn block 数必须保持在冻结阈值内",
          "actual": 3,
          "expected": 1
        },
        {
          "id": "screenplay.adaptation_meta_leakage_block_count",
          "stage": "screenplay",
          "status": "fail",
          "message": "adaptation 元信息不能泄漏到最终 screenplay 正文",
          "actual": 3,
          "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
        }
      ]
    }
  },
  "after": {
    "quality_gate": {
      "status": "pass",
      "broad_status": "warn",
      "top_issues": [
        {
          "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
          }
        }
      ]
    },
    "product_quality": {
      "status": "fail",
      "fail_count": 1,
      "warn_count": 2,
      "issue_count": 3,
      "top_issues": [
        {
          "id": "artifacts.prompt_guard",
          "stage": "prompt_guard",
          "status": "fail",
          "message": "prompt_guard 工件必须存在",
          "actual": false,
          "expected": true
        },
        {
          "id": "screenplay.purity_warn_block_count",
          "stage": "screenplay",
          "status": "warn",
          "message": "screenplay purity warn block 数必须保持在冻结阈值内",
          "actual": 3,
          "expected": 1
        },
        {
          "id": "writing_strategy.abstract_prose_risk_count",
          "stage": "writing_strategy",
          "status": "warn",
          "message": "正文不能退化成抽象解释或总结式 prose，必须回到可拍信息",
          "actual": 1,
          "expected": 0
        }
      ]
    }
  }
}