{
  "version": "screenplay_reserve_repair.v1",
  "generated_at": "2026-04-15T15:58:27.698555Z",
  "run_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
  "changed_block_count": 0,
  "changed_blocks": [],
  "downstream": {},
  "before": {
    "quality_gate": {
      "version": "screenplay_quality_gate.v2",
      "generated_at": "2026-04-15T15:58:28.484370Z",
      "candidate_run_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
      "gate_config": {
        "structure": {
          "require_artifacts": true,
          "require_non_empty_episodes": true,
          "require_non_empty_blocks": true,
          "max_missing_episode_source_refs": 0,
          "max_missing_block_source_refs": 0,
          "max_missing_block_group_refs": 0,
          "max_missing_block_beat_refs": 0,
          "max_missing_time_mode_count": 0,
          "max_empty_block_text_count": 0
        },
        "text_quality": {
          "short_block_char_threshold": 120,
          "max_short_block_ratio": 0.2,
          "summary_like_char_threshold": 180,
          "max_summary_like_ratio": 0.15,
          "max_dialogue_sparse_ratio": 0.35,
          "max_narration_overload_ratio": 0.35,
          "max_chronicle_tone_ratio": 0.0,
          "max_summary_tone_ratio": 0.0,
          "max_weak_performable_tension_ratio": 0.0,
          "max_delayed_scene_entry_ratio": 0.0,
          "max_event_bundle_summary_ratio": 0.0,
          "max_excerpt_summary_lead_ratio": 0.0,
          "max_fallback_placeholder_ratio": 0.0,
          "max_template_leak_ratio": 0.0,
          "max_title_card_meta_ratio": 0.0,
          "max_expository_voiceover_lead_ratio": 0.0,
          "max_scene_element_stacking_ratio": 0.0
        },
        "dramart": {
          "min_upload_script_chars": 2000,
          "min_upload_script_chars_floor": 600,
          "min_upload_script_chars_per_episode": 850,
          "min_upload_script_chars_per_block": 450,
          "require_upload_ready_summary": true,
          "max_missing_character_bio_ratio": 0.05,
          "max_missing_visual_card_ratio": 0.05,
          "max_missing_voice_card_ratio": 0.05,
          "max_missing_asset_binding_ratio": 0.05,
          "max_missing_identity_summary_ratio": 0.05
        },
        "manual_review": {
          "warn_on_run_needs_rewrite": true,
          "warn_on_episode_needs_rewrite": true,
          "warn_on_block_needs_rewrite": true,
          "warn_on_continuity_issue": true,
          "warn_on_summary_tone": true,
          "warn_on_weak_dialogue": true,
          "warn_on_bad_episode_boundary": true
        },
        "writing_strategy": {
          "max_subject_anchor_gap_count": 0,
          "max_dialogue_attribution_gap_count": 0,
          "max_location_anchor_gap_count": 0,
          "max_action_anchor_gap_count": 0,
          "max_abstract_prose_risk_count": 0
        }
      },
      "candidate": {
        "run_dir": "xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "run_id": "20260406T103951995961Z",
        "created_at": "2026-04-06T10:39:51.997423Z",
        "out_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "input_path": "input/西游记前十回.txt",
        "input_sha256": "7d629dc9a5cf237966935cbbc7140db4c341e5f08be33f21ead2c26ca64c9025",
        "provider": "doubao",
        "video_provider": "doubao",
        "enable_video": false,
        "style_preset": "电影化叙事，细节清晰，角色形象一致，光照连续",
        "limits": {
          "max_chars": 1800,
          "limit_chunks": null,
          "limit_scenes": null,
          "limit_shots": null
        },
        "status": "running",
        "errors": 0,
        "counts": {
          "chunks": 0,
          "ontology_samples": 0,
          "ontology_candidate_entity_types": 0,
          "ontology_candidate_relation_types": 0,
          "ontology_entity_taxonomy": 0,
          "ontology_relation_taxonomy": 0,
          "observations": 0,
          "entities": 0,
          "relations": 0,
          "type_candidates": 0,
          "type_apply_type_count": 0,
          "type_apply_subtype_count": 0,
          "type_other_before": 0,
          "type_other_after": 0,
          "entity_registry_entities": 97,
          "entity_visual_cards": 97,
          "entity_voice_cards": 38,
          "entity_asset_bindings": 97,
          "scenes": 68,
          "chronology_scenes": 0,
          "chronology_groups": 0,
          "chronology_edges": 0,
          "chronology_conflicts": 0,
          "adaptation_scenes": 68,
          "adaptation_groups": 55,
          "adaptation_beats": 55,
          "adaptation_retain_scenes": 57,
          "adaptation_compress_scenes": 11,
          "adaptation_bridge_scenes": 0,
          "adaptation_drop_scenes": 11,
          "screenplay_episodes": 9,
          "screenplay_blocks": 57,
          "screenplay_source_scene_refs": 57,
          "dramart_package_episodes": 9,
          "dramart_package_character_bios": 37,
          "dramart_package_location_assets": 24,
          "dramart_package_prop_assets": 8,
          "dramart_package_checklist": 110,
          "dramart_package_upload_chars": 38818,
          "dramart_review_checklist_done": 0,
          "dramart_review_checklist_open": 0,
          "dramart_review_upload_parts_done": 0,
          "dramart_review_upload_parts_open": 0,
          "dramart_review_episode_upload_done": 0,
          "dramart_review_episode_upload_open": 0,
          "dramart_review_events": 0,
          "scripts": 57,
          "shots": 223,
          "style_fixed_positive_terms": 9,
          "style_fixed_negative_terms": 10,
          "style_provider_profiles": 2,
          "style_manual_override_slots": 6,
          "style_reference_ready_entities": 0,
          "storyboards": 223,
          "storyboard_ready_status": "pass",
          "storyboard_ready_pass_count": 223,
          "storyboard_ready_warn_count": 0,
          "storyboard_ready_fail_count": 0,
          "storyboard_ready_issue_count": 0,
          "prompt_guard_shots": 223,
          "prompt_guard_pass_shots": 195,
          "prompt_guard_warning_shots": 23,
          "prompt_guard_fail_shots": 5,
          "prompt_guard_issue_count": 33,
          "segments": 0,
          "captions": 0,
          "audio_tasks": 0,
          "audio_results": 0,
          "video_tasks": 0,
          "video_results": 0,
          "manual_video_attempts": 0,
          "manual_video_task_covered_count": 0,
          "manual_video_result_ready_count": 0,
          "manual_video_eval_count": 0,
          "manual_video_selected_count": 0
        },
        "paths": {
          "project": "project.json",
          "manifest": "run_manifest.json",
          "chunks": "01_chunks.json",
          "ontology_samples": "01b_ontology_samples.json",
          "ontology_candidates": "01c_ontology_candidates.json",
          "ontology_doc": "01d_ontology.json",
          "kg": "02_kg.json",
          "kg_store": "02_kg_store.json",
          "kg_observations": "02_kg_observations.jsonl",
          "kg_closure": "02a_kg_closure.json",
          "kg_store_closure": "02a_kg_store_closure.json",
          "kg_closure_decisions": "02a_kg_closure_decisions.json",
          "type_candidates": "02b_type_candidates.json",
          "type_consolidation": "02c_type_consolidation.json",
          "kg_consolidated": "02d_kg_consolidated.json",
          "kg_store_consolidated": "02d_kg_store_consolidated.json",
          "entity_registry": "02e_entity_registry.json",
          "entity_visual_cards": "02f_entity_visual_cards.json",
          "entity_voice_cards": "02g_entity_voice_cards.json",
          "entity_assets": "02h_entity_assets.json",
          "kg_lite": "02i_kg_lite.json",
          "kg_lite_store": "02i_kg_lite_store.json",
          "kg_lite_decisions": "02i_kg_lite_decisions.json",
          "kg_deep": "02j_kg_deep.json",
          "kg_deep_store": "02j_kg_deep_store.json",
          "kg_deep_decisions": "02j_kg_deep_decisions.json",
          "scenes": "03_scenes.json",
          "chronology": "03b_chronology.json",
          "adaptation": "03c_adaptation.json",
          "screenplay": "03d_screenplay.json",
          "dramart_package": "03e_dramart_package.json",
          "dramart_upload_script": "03e_dramart_upload_script.md",
          "dramart_review_state": "03f_dramart_review_state.json",
          "scripts": "04_scripts.json",
          "style_bible": "04b_style_bible.json",
          "storyboard": "05_storyboard.json",
          "prompt_guard": "05b_storyboard_guard.json",
          "dramart_storyboard": "05c_dramart_storyboard.json",
          "timeline": "06_timeline.json",
          "audio_tasks": "06b_audio_tasks.json",
          "audio_results": "06c_audio_results.json",
          "video_tasks": "07_video_tasks.json",
          "video_results": "07_video_results.json",
          "manual_video_runs": "07b_manual_video_runs.json",
          "manual_video_eval": "07c_manual_video_eval.json",
          "events": "logs/run_events.jsonl",
          "errors": "logs/run_errors.jsonl",
          "stage_timings": "logs/stage_timings.jsonl",
          "llm_calls": "logs/llm_calls.jsonl",
          "report_html": "logs/run_report.html",
          "report_md": "logs/run_report.md",
          "metrics": "logs/run_metrics.json"
        },
        "dramart_review_status": "",
        "dramart_review_updated_at": "",
        "updated_at": "2026-04-15T15:58:28.451893Z",
        "run_uid": "20260406T103951995961Z",
        "run_key": "20260406T103951995961Z",
        "trace_scope": "live",
        "is_current_live": true,
        "archive_rel": "",
        "web_paths": {
          "run_root": "",
          "logs_dir": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/logs/",
          "llm_dir": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/logs/llm/",
          "manifest": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/run_manifest.json",
          "project": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/project.json",
          "report_html": "",
          "report_md": "",
          "metrics": "",
          "events": "",
          "errors": "",
          "stage_timings": "",
          "llm_calls": ""
        }
      },
      "artifacts": {
        "adaptation": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03c_adaptation.json",
        "screenplay": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay.json",
        "dramart_package": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03e_dramart_package.json",
        "dramart_storyboard": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/05c_dramart_storyboard.json",
        "screenplay_review_state": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay_review_state.json"
      },
      "metrics": {
        "adaptation_item_count": 68,
        "retained_scene_group_count": 55,
        "beat_count": 55,
        "drop_from_script_count": 11,
        "hard_merge_count": 21,
        "episode_count": 9,
        "block_count": 57,
        "episode_summary_count": 9,
        "source_scene_ref_count": 57,
        "source_group_ref_count": 57,
        "source_beat_ref_count": 57,
        "character_binding_count": 256,
        "location_binding_count": 121,
        "merge_suspect_binding_count": 3,
        "high_risk_merge_binding_count": 0,
        "unresolved_identity_binding_count": 0,
        "review_only_identity_binding_count": 3,
        "identity_issue_block_count": 0,
        "identity_issue_block_ratio": 0.0,
        "identity_review_only_block_count": 3,
        "identity_review_only_block_ratio": 0.052632,
        "unique_character_entity_count": 37,
        "unique_location_entity_count": 22,
        "missing_episode_source_ref_count": 0,
        "missing_block_source_ref_count": 0,
        "missing_block_group_ref_count": 0,
        "missing_block_beat_ref_count": 0,
        "missing_time_mode_count": 0,
        "empty_block_text_count": 0,
        "avg_block_char_count": 137.263,
        "short_block_count": 10,
        "short_block_ratio": 0.175439,
        "summary_like_block_count": 0,
        "summary_like_block_ratio": 0.0,
        "dialogue_block_count": 33,
        "dialogue_block_ratio": 0.578947,
        "dialogue_eligible_block_count": 32,
        "dialogue_sparse_block_count": 3,
        "dialogue_sparse_block_ratio": 0.09375,
        "dialogue_guard_block_count": 57,
        "dialogue_guard_miss_count": 24,
        "dialogue_guard_miss_ratio": 0.421053,
        "continuity_guard_block_count": 46,
        "narration_overload_block_count": 0,
        "narration_overload_block_ratio": 0.0,
        "chronicle_tone_block_count": 0,
        "chronicle_tone_block_ratio": 0.0,
        "summary_tone_block_count": 0,
        "summary_tone_block_ratio": 0.0,
        "weak_performable_tension_block_count": 0,
        "weak_performable_tension_block_ratio": 0.0,
        "delayed_scene_entry_block_count": 0,
        "delayed_scene_entry_block_ratio": 0.0,
        "event_bundle_summary_block_count": 0,
        "event_bundle_summary_block_ratio": 0.0,
        "excerpt_summary_lead_block_count": 0,
        "excerpt_summary_lead_block_ratio": 0.0,
        "fallback_placeholder_block_count": 0,
        "fallback_placeholder_block_ratio": 0.0,
        "template_leak_block_count": 0,
        "template_leak_block_ratio": 0.0,
        "title_card_meta_block_count": 0,
        "title_card_meta_block_ratio": 0.0,
        "expository_voiceover_lead_block_count": 0,
        "expository_voiceover_lead_block_ratio": 0.0,
        "scene_element_stacking_block_count": 0,
        "scene_element_stacking_block_ratio": 0.0,
        "character_bio_count": 37,
        "missing_character_bio_count": 0,
        "missing_character_bio_ratio": 0.0,
        "episode_summary_missing_character_bio_count": 0,
        "upload_script_char_count": 38818,
        "package_contract_present": true,
        "content_policy_version": "dramart_package_scope.v1",
        "content_policy_roles_valid": 1,
        "content_policy_source_truth_valid": 1,
        "episode_summary_source_ref_missing_count": 0,
        "episode_summary_source_ref_invalid_count": 0,
        "upload_bundle_source_ref_present": 1,
        "upload_bundle_source_ref_valid": 1,
        "upload_episode_source_ref_missing_count": 0,
        "upload_episode_source_ref_invalid_count": 0,
        "upload_part_count": 1,
        "upload_part_source_ref_missing_count": 0,
        "upload_part_source_ref_invalid_count": 0,
        "asset_contract_item_count": 106,
        "asset_missing_init_action_count": 0,
        "asset_invalid_init_action_count": 0,
        "asset_missing_risk_summary_count": 0,
        "asset_missing_source_ref_count": 0,
        "asset_invalid_source_ref_count": 0,
        "asset_review_required_count": 4,
        "asset_review_required_ratio": 0.037736,
        "package_risk_summary_present": 1,
        "package_risk_item_count": 366,
        "package_risk_flag_count": 6,
        "asset_ready_summary_present": true,
        "asset_ready_summary_inferred": 0,
        "asset_ready_status": "pass",
        "asset_ready_issue_count": 0,
        "asset_ready_fail_count": 0,
        "asset_ready_warn_count": 0,
        "upload_ready_summary_present": true,
        "upload_ready_summary_inferred": 0,
        "upload_ready_status": "pass",
        "upload_ready_issue_count": 1,
        "upload_ready_fail_count": 0,
        "upload_ready_warn_count": 0,
        "upload_ready_info_count": 1,
        "upload_has_global_preface": 1,
        "upload_time_layer_annotation_recommended": 1,
        "storyboard_ready_summary_present": true,
        "storyboard_ready_status": "pass",
        "storyboard_ready_issue_count": 0,
        "storyboard_ready_fail_count": 0,
        "storyboard_ready_warn_count": 0,
        "storyboard_ready_shot_count": 223,
        "storyboard_ready_episode_mapped_count": 223,
        "storyboard_ready_block_mapped_count": 223,
        "asset_suggestion_character_count": 37,
        "asset_suggestion_location_count": 24,
        "asset_suggestion_prop_count": 8,
        "asset_suggestion_voice_count": 37,
        "missing_visual_card_count": 0,
        "missing_visual_card_ratio": 0.0,
        "missing_voice_card_count": 0,
        "missing_voice_card_ratio": 0.0,
        "missing_asset_binding_count": 0,
        "missing_asset_binding_ratio": 0.0,
        "missing_identity_summary_count": 0,
        "missing_identity_summary_ratio": 0.0,
        "expected_min_upload_script_chars": 2000,
        "time_mode_distribution": {
          "mainline": 32,
          "rumor": 6,
          "flashback": 10,
          "insertion": 2,
          "dream": 7
        },
        "manual_review_present": false,
        "manual_review_event_count": 0,
        "manual_review_run_status": "unreviewed",
        "manual_review_episode_total": 0,
        "manual_review_episode_unreviewed_count": 0,
        "manual_review_episode_accepted_count": 0,
        "manual_review_episode_needs_rewrite_count": 0,
        "manual_review_episode_open_count": 0,
        "manual_review_block_total": 0,
        "manual_review_block_unreviewed_count": 0,
        "manual_review_block_accepted_count": 0,
        "manual_review_block_needs_rewrite_count": 0,
        "manual_review_block_open_count": 0,
        "manual_review_continuity_issue_count": 0,
        "manual_review_summary_tone_count": 0,
        "manual_review_weak_dialogue_count": 0,
        "manual_review_bad_episode_boundary_count": 0,
        "writing_strategy_status": "pass",
        "writing_strategy_checked_block_count": 57,
        "subject_anchor_gap_count": 0,
        "dialogue_attribution_gap_count": 0,
        "location_anchor_gap_count": 0,
        "action_anchor_gap_count": 0,
        "abstract_prose_risk_count": 0,
        "writing_strategy_next_fix_focus": []
      },
      "checks": [
        {
          "id": "artifacts.adaptation",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "adaptation artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03c_adaptation.json",
          "expected": "existing file path"
        },
        {
          "id": "artifacts.screenplay",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay.json",
          "expected": "existing file path"
        },
        {
          "id": "artifacts.dramart_package",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "dramart_package artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03e_dramart_package.json",
          "expected": "existing file path"
        },
        {
          "id": "structure.adaptation_items",
          "stage": "adaptation",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "adaptation items are present",
          "actual": 68,
          "expected": ">= 1"
        },
        {
          "id": "structure.episodes",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay episodes are present",
          "actual": 9,
          "expected": ">= 1"
        },
        {
          "id": "structure.blocks",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay blocks are present",
          "actual": 57,
          "expected": ">= 1"
        },
        {
          "id": "structure.character_bios",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart character bios are present",
          "actual": 37,
          "expected": ">= 1"
        },
        {
          "id": "structure.episode_summaries",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart episode summaries are present",
          "actual": 9,
          "expected": ">= 1"
        },
        {
          "id": "structure.upload_bundle",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.upload_ready_summary",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.asset_ready_summary",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.storyboard_ready_summary",
          "stage": "storyboard",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.content_policy_version",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package content-policy version is present",
          "actual": "dramart_package_scope.v1",
          "expected": {
            "content_policy_version": "non-empty string"
          }
        },
        {
          "id": "contract.content_policy_roles",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package content-policy roles are valid",
          "actual": true,
          "expected": {
            "required_roles": [
              "asset_suggestion_layer",
              "export_layer",
              "risk_reveal_layer"
            ]
          }
        },
        {
          "id": "contract.content_policy_source_of_truth",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package source-of-truth map is present",
          "actual": true,
          "expected": {
            "required_keys": [
              "asset_bindings",
              "entity_registry",
              "screenplay",
              "visual_cards",
              "voice_cards"
            ]
          }
        },
        {
          "id": "contract.episode_summary_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_episode_summary_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.episode_summary_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_episode_summary_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.upload_episode_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_episode_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.upload_episode_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_episode_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.upload_part_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_part_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.upload_part_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_part_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.asset_missing_init_action_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_init_action_count": 0
          }
        },
        {
          "id": "contract.asset_invalid_init_action_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_invalid_init_action_count": 0
          }
        },
        {
          "id": "contract.asset_missing_risk_summary_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_risk_summary_count": 0
          }
        },
        {
          "id": "contract.asset_missing_source_ref_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_source_ref_count": 0
          }
        },
        {
          "id": "contract.asset_invalid_source_ref_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_invalid_source_ref_count": 0
          }
        },
        {
          "id": "contract.upload_bundle_source_ref_present",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle source_ref is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.upload_bundle_source_ref_valid",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle source_ref is valid",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.package_risk_summary_present",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package risk_summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.episode_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing episode source refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_episode_source_ref_count": 0
          }
        },
        {
          "id": "structure.block_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block source refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_source_ref_count": 0
          }
        },
        {
          "id": "structure.block_group_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block group refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_group_ref_count": 0
          }
        },
        {
          "id": "structure.block_beat_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block beat refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_beat_ref_count": 0
          }
        },
        {
          "id": "structure.time_modes",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing time modes stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_time_mode_count": 0
          }
        },
        {
          "id": "structure.empty_block_text",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "empty block text count stays within threshold",
          "actual": 0,
          "expected": {
            "max_empty_block_text_count": 0
          }
        },
        {
          "id": "text_quality.short_block_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "short block ratio stays within threshold",
          "actual": 0.175439,
          "expected": {
            "max_short_block_ratio": 0.2
          }
        },
        {
          "id": "text_quality.summary_like_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "summary-like block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_summary_like_block_ratio": 0.15
          }
        },
        {
          "id": "text_quality.dialogue_sparse_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "dialogue-sparse block ratio stays within threshold",
          "actual": 0.09375,
          "expected": {
            "max_dialogue_sparse_block_ratio": 0.35
          }
        },
        {
          "id": "text_quality.narration_overload_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "narration-overload block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_narration_overload_block_ratio": 0.35
          }
        },
        {
          "id": "text_quality.chronicle_tone_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "chronicle-tone block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_chronicle_tone_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.summary_tone_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "summary-tone block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_summary_tone_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.weak_performable_tension_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "weak performable tension ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_weak_performable_tension_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.delayed_scene_entry_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "delayed scene entry ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_delayed_scene_entry_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.event_bundle_summary_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "event bundle summary ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_event_bundle_summary_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.excerpt_summary_lead_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "excerpt-summary lead ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_excerpt_summary_lead_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.fallback_placeholder_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "fallback-placeholder block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_fallback_placeholder_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.template_leak_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "template-leak block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_template_leak_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.title_card_meta_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "title-card meta block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_title_card_meta_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.expository_voiceover_lead_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "expository voiceover lead ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_expository_voiceover_lead_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.scene_element_stacking_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "scene-element stacking ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_scene_element_stacking_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.subject_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "subject anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_subject_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.dialogue_attribution_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "dialogue attribution gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_dialogue_attribution_gap_count": 0
          }
        },
        {
          "id": "text_quality.location_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "location anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_location_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.action_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "action anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_action_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.abstract_prose_risk_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "abstract prose risk count stays within threshold",
          "actual": 0,
          "expected": {
            "max_abstract_prose_risk_count": 0
          }
        },
        {
          "id": "dramart.upload_script_chars",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload script length meets minimum threshold",
          "actual": 38818,
          "expected": {
            "min_upload_script_chars": 2000
          }
        },
        {
          "id": "dramart.upload_ready_status",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.upload_ready_fail_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_upload_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.upload_ready_warn_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_upload_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.asset_ready_status",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.asset_ready_fail_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_asset_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.asset_ready_warn_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_asset_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.storyboard_ready_status",
          "stage": "storyboard",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.storyboard_ready_fail_count",
          "stage": "storyboard",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_storyboard_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.storyboard_ready_warn_count",
          "stage": "storyboard",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_storyboard_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.missing_character_bio_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing character bio ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_character_bio_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_visual_card_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing visual card ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_visual_card_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_voice_card_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing voice card ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_voice_card_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_asset_binding_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing asset binding ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_asset_binding_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_identity_summary_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing identity summary ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_identity_summary_ratio": 0.05
          }
        }
      ],
      "summary": {
        "check_count": 70,
        "failure_count": 0,
        "warning_count": 0,
        "delivery_failure_count": 0,
        "delivery_warning_count": 0,
        "baseline_failure_count": 0,
        "baseline_warning_count": 0,
        "failure_type_counts": {
          "delivery": {},
          "baseline": {}
        }
      },
      "top_issues": [],
      "recommendations": [],
      "status": "pass",
      "broad_status": "pass",
      "failure_buckets": {
        "delivery": {},
        "baseline": {}
      }
    },
    "product_quality": {
      "version": "screenplay_product_quality.v1",
      "generated_at": "2026-04-15T15:58:28.783115Z",
      "meta": {
        "run_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "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": 9,
        "block_count": 57,
        "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": 10,
        "montage_tag_block_count": 3,
        "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": [
          {
            "episode_id": "EP0005",
            "block_id": "EP0005B002",
            "title": "【闪回】【蒙太奇】孙悟空与众猴开仙酒会",
            "lead_scene_id": "S0033",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（花果山）\n孙悟空逃回花果山与众猴讲述经历，孙悟空与众猴开仙酒会，七衣仙女向王母奏报蟠桃被偷，太上老君向玉帝奏报金丹失窃，赤脚大仙揭露孙悟空假传旨意。\n太上老君刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替太上老君把这句接过去。\n等众猴把话越压越实，场上的人便只剩点头附和的份；太上老君也只能赶紧把奉承话递上去。"
          },
          {
            "episode_id": "EP0009",
            "block_id": "EP0009B004",
            "title": "【闪回】【蒙太奇】太宗目睹十八层地狱惨状",
            "lead_scene_id": "S0068",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（奈河桥）\n太宗目睹十八层地狱惨状，奈河桥三桥对比，枉死城冤魂索命，借相良金银解围。\n唐太宗：门道先听清，后面的路才走得下去。\n太宗目睹十八层地狱惨状。\n奈河桥三桥对比。\n枉死城冤魂索命。\n借相良金银解围。\n太宗渡过阴山，观十八层地狱，过奈河桥，于枉死城遭冤魂索命，借相良金银方。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B002",
            "title": "【传闻】石猴带领众猴进入水帘洞",
            "lead_scene_id": "S0003",
            "presentation_mode": "dialogue",
            "time_modes": [
              "rumor"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:传闻"
            ],
            "screenplay_preview": "（水帘洞）\n美猴王把话往最难接的那层一压，周围的人都不敢轻易出声。\n美猴王刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替美猴王把这句接过去。\n等美猴王把话越压越实，场上的人便只剩点头附和的份。\n石猴带领众猴进入水帘洞。\n石猴称王并被尊为美猴王。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B003",
            "title": "【蒙太奇】众猴饯行盛宴",
            "lead_scene_id": "S0004",
            "presentation_mode": "montage",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（南赡部洲）\n众猴饯行盛宴，发现秀丽高山，美猴王独自登筏，驶向茫茫大海，美猴王独自登筏渡海，抵达南赡部洲并观察人世。\n众猴饯行盛宴，美猴王独自登筏渡海，抵达南赡部洲并观察人世，渡西海抵达西牛贺洲，发现秀丽高山。\n众猴饯行盛宴。\n发现秀丽高山。\n美猴王独自登筏，驶向茫茫大海。\n美猴王告别众猴，乘筏渡海至南赡部洲，后至西牛贺洲寻访神仙。"
          }
        ],
        "normal_blocks": [
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B001",
            "title": "仙石迸裂、石猴诞生",
            "lead_scene_id": "S0002",
            "presentation_mode": "action",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（灵霄宝殿）\n开篇诗，仙石迸裂、石猴诞生，石猴目运金光，金光惊动天庭，玉帝命千里眼顺风耳探查。\n开篇诗。\n玉帝命千里眼顺风耳探查。\n仙石迸裂、石猴诞生。\n石猴跳入瀑布，发现水帘洞，这不仅是地理上的发现。\n开篇诗与天地开辟，花果山仙石迸裂产石猴，目运金光惊动玉帝。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B004",
            "title": "美猴王在山中听到歌声，循声发现一砍柴樵夫。",
            "lead_scene_id": "S0005",
            "presentation_mode": "dialogue",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（南赡部洲）\n石猴闻歌寻声，樵夫歌唱《满庭芳》，石猴误认樵夫为神仙，樵夫解释歌谣来源。\n美猴王：神仙。\n石猴闻歌寻声。\n樵夫歌唱《满庭芳》。\n石猴误认樵夫为神仙。\n樵夫解释歌谣来源。"
          }
        ]
      },
      "writing_strategy": {
        "status": "pass",
        "block_count": 57,
        "pass_block_count": 57,
        "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": "pass",
        "upload_ready": true,
        "asset_ready": true,
        "storyboard_ready": "unknown",
        "upload_script_char_count": 38818,
        "upload_script_line_count": 1017,
        "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- 如来（剧本中亦作：佛老 / 佛祖 / 释迦牟尼尊者）…"
      },
      "prompt_guard": {
        "shot_count": 223,
        "issue_count": 33,
        "delivery_fix_queue_size": 26,
        "text_quality_acceptance_status": "fail",
        "tri_layer_acceptance_status": "warning",
        "dramart_delivery_acceptance_status": "fail"
      },
      "spot_check": {
        "risk_blocks": [
          {
            "episode_id": "EP0005",
            "block_id": "EP0005B002",
            "title": "【闪回】【蒙太奇】孙悟空与众猴开仙酒会",
            "lead_scene_id": "S0033",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（花果山）\n孙悟空逃回花果山与众猴讲述经历，孙悟空与众猴开仙酒会，七衣仙女向王母奏报蟠桃被偷，太上老君向玉帝奏报金丹失窃，赤脚大仙揭露孙悟空假传旨意。\n太上老君刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替太上老君把这句接过去。\n等众猴把话越压越实，场上的人便只剩点头附和的份；太上老君也只能赶紧把奉承话递上去。"
          },
          {
            "episode_id": "EP0009",
            "block_id": "EP0009B004",
            "title": "【闪回】【蒙太奇】太宗目睹十八层地狱惨状",
            "lead_scene_id": "S0068",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（奈河桥）\n太宗目睹十八层地狱惨状，奈河桥三桥对比，枉死城冤魂索命，借相良金银解围。\n唐太宗：门道先听清，后面的路才走得下去。\n太宗目睹十八层地狱惨状。\n奈河桥三桥对比。\n枉死城冤魂索命。\n借相良金银解围。\n太宗渡过阴山，观十八层地狱，过奈河桥，于枉死城遭冤魂索命，借相良金银方。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B002",
            "title": "【传闻】石猴带领众猴进入水帘洞",
            "lead_scene_id": "S0003",
            "presentation_mode": "dialogue",
            "time_modes": [
              "rumor"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:传闻"
            ],
            "screenplay_preview": "（水帘洞）\n美猴王把话往最难接的那层一压，周围的人都不敢轻易出声。\n美猴王刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替美猴王把这句接过去。\n等美猴王把话越压越实，场上的人便只剩点头附和的份。\n石猴带领众猴进入水帘洞。\n石猴称王并被尊为美猴王。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B003",
            "title": "【蒙太奇】众猴饯行盛宴",
            "lead_scene_id": "S0004",
            "presentation_mode": "montage",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（南赡部洲）\n众猴饯行盛宴，发现秀丽高山，美猴王独自登筏，驶向茫茫大海，美猴王独自登筏渡海，抵达南赡部洲并观察人世。\n众猴饯行盛宴，美猴王独自登筏渡海，抵达南赡部洲并观察人世，渡西海抵达西牛贺洲，发现秀丽高山。\n众猴饯行盛宴。\n发现秀丽高山。\n美猴王独自登筏，驶向茫茫大海。\n美猴王告别众猴，乘筏渡海至南赡部洲，后至西牛贺洲寻访神仙。"
          }
        ],
        "normal_blocks": [
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B001",
            "title": "仙石迸裂、石猴诞生",
            "lead_scene_id": "S0002",
            "presentation_mode": "action",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（灵霄宝殿）\n开篇诗，仙石迸裂、石猴诞生，石猴目运金光，金光惊动天庭，玉帝命千里眼顺风耳探查。\n开篇诗。\n玉帝命千里眼顺风耳探查。\n仙石迸裂、石猴诞生。\n石猴跳入瀑布，发现水帘洞，这不仅是地理上的发现。\n开篇诗与天地开辟，花果山仙石迸裂产石猴，目运金光惊动玉帝。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B004",
            "title": "美猴王在山中听到歌声，循声发现一砍柴樵夫。",
            "lead_scene_id": "S0005",
            "presentation_mode": "dialogue",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（南赡部洲）\n石猴闻歌寻声，樵夫歌唱《满庭芳》，石猴误认樵夫为神仙，樵夫解释歌谣来源。\n美猴王：神仙。\n石猴闻歌寻声。\n樵夫歌唱《满庭芳》。\n石猴误认樵夫为神仙。\n樵夫解释歌谣来源。"
          }
        ],
        "recommended_manual_sample_count": 6
      },
      "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": 38818,
          "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": "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"
        }
      ]
    }
  },
  "after": {
    "quality_gate": {
      "version": "screenplay_quality_gate.v2",
      "generated_at": "2026-04-15T15:58:29.695644Z",
      "candidate_run_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
      "gate_config": {
        "structure": {
          "require_artifacts": true,
          "require_non_empty_episodes": true,
          "require_non_empty_blocks": true,
          "max_missing_episode_source_refs": 0,
          "max_missing_block_source_refs": 0,
          "max_missing_block_group_refs": 0,
          "max_missing_block_beat_refs": 0,
          "max_missing_time_mode_count": 0,
          "max_empty_block_text_count": 0
        },
        "text_quality": {
          "short_block_char_threshold": 120,
          "max_short_block_ratio": 0.2,
          "summary_like_char_threshold": 180,
          "max_summary_like_ratio": 0.15,
          "max_dialogue_sparse_ratio": 0.35,
          "max_narration_overload_ratio": 0.35,
          "max_chronicle_tone_ratio": 0.0,
          "max_summary_tone_ratio": 0.0,
          "max_weak_performable_tension_ratio": 0.0,
          "max_delayed_scene_entry_ratio": 0.0,
          "max_event_bundle_summary_ratio": 0.0,
          "max_excerpt_summary_lead_ratio": 0.0,
          "max_fallback_placeholder_ratio": 0.0,
          "max_template_leak_ratio": 0.0,
          "max_title_card_meta_ratio": 0.0,
          "max_expository_voiceover_lead_ratio": 0.0,
          "max_scene_element_stacking_ratio": 0.0
        },
        "dramart": {
          "min_upload_script_chars": 2000,
          "min_upload_script_chars_floor": 600,
          "min_upload_script_chars_per_episode": 850,
          "min_upload_script_chars_per_block": 450,
          "require_upload_ready_summary": true,
          "max_missing_character_bio_ratio": 0.05,
          "max_missing_visual_card_ratio": 0.05,
          "max_missing_voice_card_ratio": 0.05,
          "max_missing_asset_binding_ratio": 0.05,
          "max_missing_identity_summary_ratio": 0.05
        },
        "manual_review": {
          "warn_on_run_needs_rewrite": true,
          "warn_on_episode_needs_rewrite": true,
          "warn_on_block_needs_rewrite": true,
          "warn_on_continuity_issue": true,
          "warn_on_summary_tone": true,
          "warn_on_weak_dialogue": true,
          "warn_on_bad_episode_boundary": true
        },
        "writing_strategy": {
          "max_subject_anchor_gap_count": 0,
          "max_dialogue_attribution_gap_count": 0,
          "max_location_anchor_gap_count": 0,
          "max_action_anchor_gap_count": 0,
          "max_abstract_prose_risk_count": 0
        }
      },
      "candidate": {
        "run_dir": "xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "run_id": "20260406T103951995961Z",
        "created_at": "2026-04-06T10:39:51.997423Z",
        "out_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "input_path": "input/西游记前十回.txt",
        "input_sha256": "7d629dc9a5cf237966935cbbc7140db4c341e5f08be33f21ead2c26ca64c9025",
        "provider": "doubao",
        "video_provider": "doubao",
        "enable_video": false,
        "style_preset": "电影化叙事，细节清晰，角色形象一致，光照连续",
        "limits": {
          "max_chars": 1800,
          "limit_chunks": null,
          "limit_scenes": null,
          "limit_shots": null
        },
        "status": "running",
        "errors": 0,
        "counts": {
          "chunks": 0,
          "ontology_samples": 0,
          "ontology_candidate_entity_types": 0,
          "ontology_candidate_relation_types": 0,
          "ontology_entity_taxonomy": 0,
          "ontology_relation_taxonomy": 0,
          "observations": 0,
          "entities": 0,
          "relations": 0,
          "type_candidates": 0,
          "type_apply_type_count": 0,
          "type_apply_subtype_count": 0,
          "type_other_before": 0,
          "type_other_after": 0,
          "entity_registry_entities": 97,
          "entity_visual_cards": 97,
          "entity_voice_cards": 38,
          "entity_asset_bindings": 97,
          "scenes": 68,
          "chronology_scenes": 0,
          "chronology_groups": 0,
          "chronology_edges": 0,
          "chronology_conflicts": 0,
          "adaptation_scenes": 68,
          "adaptation_groups": 55,
          "adaptation_beats": 55,
          "adaptation_retain_scenes": 57,
          "adaptation_compress_scenes": 11,
          "adaptation_bridge_scenes": 0,
          "adaptation_drop_scenes": 11,
          "screenplay_episodes": 9,
          "screenplay_blocks": 57,
          "screenplay_source_scene_refs": 57,
          "dramart_package_episodes": 9,
          "dramart_package_character_bios": 37,
          "dramart_package_location_assets": 24,
          "dramart_package_prop_assets": 8,
          "dramart_package_checklist": 110,
          "dramart_package_upload_chars": 38818,
          "dramart_review_checklist_done": 0,
          "dramart_review_checklist_open": 0,
          "dramart_review_upload_parts_done": 0,
          "dramart_review_upload_parts_open": 0,
          "dramart_review_episode_upload_done": 0,
          "dramart_review_episode_upload_open": 0,
          "dramart_review_events": 0,
          "scripts": 57,
          "shots": 223,
          "style_fixed_positive_terms": 9,
          "style_fixed_negative_terms": 10,
          "style_provider_profiles": 2,
          "style_manual_override_slots": 6,
          "style_reference_ready_entities": 0,
          "storyboards": 223,
          "storyboard_ready_status": "pass",
          "storyboard_ready_pass_count": 223,
          "storyboard_ready_warn_count": 0,
          "storyboard_ready_fail_count": 0,
          "storyboard_ready_issue_count": 0,
          "prompt_guard_shots": 223,
          "prompt_guard_pass_shots": 195,
          "prompt_guard_warning_shots": 23,
          "prompt_guard_fail_shots": 5,
          "prompt_guard_issue_count": 33,
          "segments": 0,
          "captions": 0,
          "audio_tasks": 0,
          "audio_results": 0,
          "video_tasks": 0,
          "video_results": 0,
          "manual_video_attempts": 0,
          "manual_video_task_covered_count": 0,
          "manual_video_result_ready_count": 0,
          "manual_video_eval_count": 0,
          "manual_video_selected_count": 0
        },
        "paths": {
          "project": "project.json",
          "manifest": "run_manifest.json",
          "chunks": "01_chunks.json",
          "ontology_samples": "01b_ontology_samples.json",
          "ontology_candidates": "01c_ontology_candidates.json",
          "ontology_doc": "01d_ontology.json",
          "kg": "02_kg.json",
          "kg_store": "02_kg_store.json",
          "kg_observations": "02_kg_observations.jsonl",
          "kg_closure": "02a_kg_closure.json",
          "kg_store_closure": "02a_kg_store_closure.json",
          "kg_closure_decisions": "02a_kg_closure_decisions.json",
          "type_candidates": "02b_type_candidates.json",
          "type_consolidation": "02c_type_consolidation.json",
          "kg_consolidated": "02d_kg_consolidated.json",
          "kg_store_consolidated": "02d_kg_store_consolidated.json",
          "entity_registry": "02e_entity_registry.json",
          "entity_visual_cards": "02f_entity_visual_cards.json",
          "entity_voice_cards": "02g_entity_voice_cards.json",
          "entity_assets": "02h_entity_assets.json",
          "kg_lite": "02i_kg_lite.json",
          "kg_lite_store": "02i_kg_lite_store.json",
          "kg_lite_decisions": "02i_kg_lite_decisions.json",
          "kg_deep": "02j_kg_deep.json",
          "kg_deep_store": "02j_kg_deep_store.json",
          "kg_deep_decisions": "02j_kg_deep_decisions.json",
          "scenes": "03_scenes.json",
          "chronology": "03b_chronology.json",
          "adaptation": "03c_adaptation.json",
          "screenplay": "03d_screenplay.json",
          "dramart_package": "03e_dramart_package.json",
          "dramart_upload_script": "03e_dramart_upload_script.md",
          "dramart_review_state": "03f_dramart_review_state.json",
          "scripts": "04_scripts.json",
          "style_bible": "04b_style_bible.json",
          "storyboard": "05_storyboard.json",
          "prompt_guard": "05b_storyboard_guard.json",
          "dramart_storyboard": "05c_dramart_storyboard.json",
          "timeline": "06_timeline.json",
          "audio_tasks": "06b_audio_tasks.json",
          "audio_results": "06c_audio_results.json",
          "video_tasks": "07_video_tasks.json",
          "video_results": "07_video_results.json",
          "manual_video_runs": "07b_manual_video_runs.json",
          "manual_video_eval": "07c_manual_video_eval.json",
          "events": "logs/run_events.jsonl",
          "errors": "logs/run_errors.jsonl",
          "stage_timings": "logs/stage_timings.jsonl",
          "llm_calls": "logs/llm_calls.jsonl",
          "report_html": "logs/run_report.html",
          "report_md": "logs/run_report.md",
          "metrics": "logs/run_metrics.json"
        },
        "dramart_review_status": "",
        "dramart_review_updated_at": "",
        "updated_at": "2026-04-15T15:58:29.657365Z",
        "run_uid": "20260406T103951995961Z",
        "run_key": "20260406T103951995961Z",
        "trace_scope": "live",
        "is_current_live": true,
        "archive_rel": "",
        "web_paths": {
          "run_root": "",
          "logs_dir": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/logs/",
          "llm_dir": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/logs/llm/",
          "manifest": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/run_manifest.json",
          "project": "/novel2video/runs/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/project.json",
          "report_html": "",
          "report_md": "",
          "metrics": "",
          "events": "",
          "errors": "",
          "stage_timings": "",
          "llm_calls": ""
        }
      },
      "artifacts": {
        "adaptation": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03c_adaptation.json",
        "screenplay": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay.json",
        "dramart_package": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03e_dramart_package.json",
        "dramart_storyboard": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/05c_dramart_storyboard.json",
        "screenplay_review_state": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay_review_state.json"
      },
      "metrics": {
        "adaptation_item_count": 68,
        "retained_scene_group_count": 55,
        "beat_count": 55,
        "drop_from_script_count": 11,
        "hard_merge_count": 21,
        "episode_count": 9,
        "block_count": 57,
        "episode_summary_count": 9,
        "source_scene_ref_count": 57,
        "source_group_ref_count": 57,
        "source_beat_ref_count": 57,
        "character_binding_count": 256,
        "location_binding_count": 121,
        "merge_suspect_binding_count": 3,
        "high_risk_merge_binding_count": 0,
        "unresolved_identity_binding_count": 0,
        "review_only_identity_binding_count": 3,
        "identity_issue_block_count": 0,
        "identity_issue_block_ratio": 0.0,
        "identity_review_only_block_count": 3,
        "identity_review_only_block_ratio": 0.052632,
        "unique_character_entity_count": 37,
        "unique_location_entity_count": 22,
        "missing_episode_source_ref_count": 0,
        "missing_block_source_ref_count": 0,
        "missing_block_group_ref_count": 0,
        "missing_block_beat_ref_count": 0,
        "missing_time_mode_count": 0,
        "empty_block_text_count": 0,
        "avg_block_char_count": 137.263,
        "short_block_count": 10,
        "short_block_ratio": 0.175439,
        "summary_like_block_count": 0,
        "summary_like_block_ratio": 0.0,
        "dialogue_block_count": 33,
        "dialogue_block_ratio": 0.578947,
        "dialogue_eligible_block_count": 32,
        "dialogue_sparse_block_count": 3,
        "dialogue_sparse_block_ratio": 0.09375,
        "dialogue_guard_block_count": 57,
        "dialogue_guard_miss_count": 24,
        "dialogue_guard_miss_ratio": 0.421053,
        "continuity_guard_block_count": 46,
        "narration_overload_block_count": 0,
        "narration_overload_block_ratio": 0.0,
        "chronicle_tone_block_count": 0,
        "chronicle_tone_block_ratio": 0.0,
        "summary_tone_block_count": 0,
        "summary_tone_block_ratio": 0.0,
        "weak_performable_tension_block_count": 0,
        "weak_performable_tension_block_ratio": 0.0,
        "delayed_scene_entry_block_count": 0,
        "delayed_scene_entry_block_ratio": 0.0,
        "event_bundle_summary_block_count": 0,
        "event_bundle_summary_block_ratio": 0.0,
        "excerpt_summary_lead_block_count": 0,
        "excerpt_summary_lead_block_ratio": 0.0,
        "fallback_placeholder_block_count": 0,
        "fallback_placeholder_block_ratio": 0.0,
        "template_leak_block_count": 0,
        "template_leak_block_ratio": 0.0,
        "title_card_meta_block_count": 0,
        "title_card_meta_block_ratio": 0.0,
        "expository_voiceover_lead_block_count": 0,
        "expository_voiceover_lead_block_ratio": 0.0,
        "scene_element_stacking_block_count": 0,
        "scene_element_stacking_block_ratio": 0.0,
        "character_bio_count": 37,
        "missing_character_bio_count": 0,
        "missing_character_bio_ratio": 0.0,
        "episode_summary_missing_character_bio_count": 0,
        "upload_script_char_count": 38818,
        "package_contract_present": true,
        "content_policy_version": "dramart_package_scope.v1",
        "content_policy_roles_valid": 1,
        "content_policy_source_truth_valid": 1,
        "episode_summary_source_ref_missing_count": 0,
        "episode_summary_source_ref_invalid_count": 0,
        "upload_bundle_source_ref_present": 1,
        "upload_bundle_source_ref_valid": 1,
        "upload_episode_source_ref_missing_count": 0,
        "upload_episode_source_ref_invalid_count": 0,
        "upload_part_count": 1,
        "upload_part_source_ref_missing_count": 0,
        "upload_part_source_ref_invalid_count": 0,
        "asset_contract_item_count": 106,
        "asset_missing_init_action_count": 0,
        "asset_invalid_init_action_count": 0,
        "asset_missing_risk_summary_count": 0,
        "asset_missing_source_ref_count": 0,
        "asset_invalid_source_ref_count": 0,
        "asset_review_required_count": 4,
        "asset_review_required_ratio": 0.037736,
        "package_risk_summary_present": 1,
        "package_risk_item_count": 366,
        "package_risk_flag_count": 6,
        "asset_ready_summary_present": true,
        "asset_ready_summary_inferred": 0,
        "asset_ready_status": "pass",
        "asset_ready_issue_count": 0,
        "asset_ready_fail_count": 0,
        "asset_ready_warn_count": 0,
        "upload_ready_summary_present": true,
        "upload_ready_summary_inferred": 0,
        "upload_ready_status": "pass",
        "upload_ready_issue_count": 1,
        "upload_ready_fail_count": 0,
        "upload_ready_warn_count": 0,
        "upload_ready_info_count": 1,
        "upload_has_global_preface": 1,
        "upload_time_layer_annotation_recommended": 1,
        "storyboard_ready_summary_present": true,
        "storyboard_ready_status": "pass",
        "storyboard_ready_issue_count": 0,
        "storyboard_ready_fail_count": 0,
        "storyboard_ready_warn_count": 0,
        "storyboard_ready_shot_count": 223,
        "storyboard_ready_episode_mapped_count": 223,
        "storyboard_ready_block_mapped_count": 223,
        "asset_suggestion_character_count": 37,
        "asset_suggestion_location_count": 24,
        "asset_suggestion_prop_count": 8,
        "asset_suggestion_voice_count": 37,
        "missing_visual_card_count": 0,
        "missing_visual_card_ratio": 0.0,
        "missing_voice_card_count": 0,
        "missing_voice_card_ratio": 0.0,
        "missing_asset_binding_count": 0,
        "missing_asset_binding_ratio": 0.0,
        "missing_identity_summary_count": 0,
        "missing_identity_summary_ratio": 0.0,
        "expected_min_upload_script_chars": 2000,
        "time_mode_distribution": {
          "mainline": 32,
          "rumor": 6,
          "flashback": 10,
          "insertion": 2,
          "dream": 7
        },
        "manual_review_present": false,
        "manual_review_event_count": 0,
        "manual_review_run_status": "unreviewed",
        "manual_review_episode_total": 0,
        "manual_review_episode_unreviewed_count": 0,
        "manual_review_episode_accepted_count": 0,
        "manual_review_episode_needs_rewrite_count": 0,
        "manual_review_episode_open_count": 0,
        "manual_review_block_total": 0,
        "manual_review_block_unreviewed_count": 0,
        "manual_review_block_accepted_count": 0,
        "manual_review_block_needs_rewrite_count": 0,
        "manual_review_block_open_count": 0,
        "manual_review_continuity_issue_count": 0,
        "manual_review_summary_tone_count": 0,
        "manual_review_weak_dialogue_count": 0,
        "manual_review_bad_episode_boundary_count": 0,
        "writing_strategy_status": "pass",
        "writing_strategy_checked_block_count": 57,
        "subject_anchor_gap_count": 0,
        "dialogue_attribution_gap_count": 0,
        "location_anchor_gap_count": 0,
        "action_anchor_gap_count": 0,
        "abstract_prose_risk_count": 0,
        "writing_strategy_next_fix_focus": []
      },
      "checks": [
        {
          "id": "artifacts.adaptation",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "adaptation artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03c_adaptation.json",
          "expected": "existing file path"
        },
        {
          "id": "artifacts.screenplay",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03d_screenplay.json",
          "expected": "existing file path"
        },
        {
          "id": "artifacts.dramart_package",
          "stage": "screenplay_gate",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "dramart_package artifact is present",
          "actual": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2/03e_dramart_package.json",
          "expected": "existing file path"
        },
        {
          "id": "structure.adaptation_items",
          "stage": "adaptation",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "adaptation items are present",
          "actual": 68,
          "expected": ">= 1"
        },
        {
          "id": "structure.episodes",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay episodes are present",
          "actual": 9,
          "expected": ">= 1"
        },
        {
          "id": "structure.blocks",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "screenplay blocks are present",
          "actual": 57,
          "expected": ">= 1"
        },
        {
          "id": "structure.character_bios",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart character bios are present",
          "actual": 37,
          "expected": ">= 1"
        },
        {
          "id": "structure.episode_summaries",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart episode summaries are present",
          "actual": 9,
          "expected": ">= 1"
        },
        {
          "id": "structure.upload_bundle",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.upload_ready_summary",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.asset_ready_summary",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.storyboard_ready_summary",
          "stage": "storyboard",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.content_policy_version",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package content-policy version is present",
          "actual": "dramart_package_scope.v1",
          "expected": {
            "content_policy_version": "non-empty string"
          }
        },
        {
          "id": "contract.content_policy_roles",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package content-policy roles are valid",
          "actual": true,
          "expected": {
            "required_roles": [
              "asset_suggestion_layer",
              "export_layer",
              "risk_reveal_layer"
            ]
          }
        },
        {
          "id": "contract.content_policy_source_of_truth",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package source-of-truth map is present",
          "actual": true,
          "expected": {
            "required_keys": [
              "asset_bindings",
              "entity_registry",
              "screenplay",
              "visual_cards",
              "voice_cards"
            ]
          }
        },
        {
          "id": "contract.episode_summary_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_episode_summary_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.episode_summary_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_episode_summary_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.upload_episode_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_episode_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.upload_episode_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_episode_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.upload_part_source_ref_missing_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_part_source_ref_missing_count": 0
          }
        },
        {
          "id": "contract.upload_part_source_ref_invalid_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_upload_part_source_ref_invalid_count": 0
          }
        },
        {
          "id": "contract.asset_missing_init_action_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_init_action_count": 0
          }
        },
        {
          "id": "contract.asset_invalid_init_action_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_invalid_init_action_count": 0
          }
        },
        {
          "id": "contract.asset_missing_risk_summary_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_risk_summary_count": 0
          }
        },
        {
          "id": "contract.asset_missing_source_ref_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_missing_source_ref_count": 0
          }
        },
        {
          "id": "contract.asset_invalid_source_ref_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "contract field stays valid",
          "actual": 0,
          "expected": {
            "max_asset_invalid_source_ref_count": 0
          }
        },
        {
          "id": "contract.upload_bundle_source_ref_present",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle source_ref is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.upload_bundle_source_ref_valid",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart upload bundle source_ref is valid",
          "actual": true,
          "expected": true
        },
        {
          "id": "contract.package_risk_summary_present",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "contract_regression",
          "track_view": "delivery",
          "message": "dramart package risk_summary is present",
          "actual": true,
          "expected": true
        },
        {
          "id": "structure.episode_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing episode source refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_episode_source_ref_count": 0
          }
        },
        {
          "id": "structure.block_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block source refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_source_ref_count": 0
          }
        },
        {
          "id": "structure.block_group_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block group refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_group_ref_count": 0
          }
        },
        {
          "id": "structure.block_beat_sources",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing block beat refs stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_block_beat_ref_count": 0
          }
        },
        {
          "id": "structure.time_modes",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "missing time modes stay within threshold",
          "actual": 0,
          "expected": {
            "max_missing_time_mode_count": 0
          }
        },
        {
          "id": "structure.empty_block_text",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "structure_regression",
          "track_view": "delivery",
          "message": "empty block text count stays within threshold",
          "actual": 0,
          "expected": {
            "max_empty_block_text_count": 0
          }
        },
        {
          "id": "text_quality.short_block_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "short block ratio stays within threshold",
          "actual": 0.175439,
          "expected": {
            "max_short_block_ratio": 0.2
          }
        },
        {
          "id": "text_quality.summary_like_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "summary-like block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_summary_like_block_ratio": 0.15
          }
        },
        {
          "id": "text_quality.dialogue_sparse_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "dialogue-sparse block ratio stays within threshold",
          "actual": 0.09375,
          "expected": {
            "max_dialogue_sparse_block_ratio": 0.35
          }
        },
        {
          "id": "text_quality.narration_overload_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "narration-overload block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_narration_overload_block_ratio": 0.35
          }
        },
        {
          "id": "text_quality.chronicle_tone_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "chronicle-tone block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_chronicle_tone_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.summary_tone_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "summary-tone block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_summary_tone_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.weak_performable_tension_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "weak performable tension ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_weak_performable_tension_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.delayed_scene_entry_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "delayed scene entry ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_delayed_scene_entry_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.event_bundle_summary_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "event bundle summary ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_event_bundle_summary_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.excerpt_summary_lead_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "excerpt-summary lead ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_excerpt_summary_lead_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.fallback_placeholder_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "fallback-placeholder block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_fallback_placeholder_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.template_leak_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "template-leak block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_template_leak_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.title_card_meta_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "title-card meta block ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_title_card_meta_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.expository_voiceover_lead_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "expository voiceover lead ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_expository_voiceover_lead_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.scene_element_stacking_ratio",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "scene-element stacking ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_scene_element_stacking_block_ratio": 0.0
          }
        },
        {
          "id": "text_quality.subject_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "subject anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_subject_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.dialogue_attribution_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "error",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "dialogue attribution gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_dialogue_attribution_gap_count": 0
          }
        },
        {
          "id": "text_quality.location_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "text_quality_regression",
          "track_view": "delivery",
          "message": "location anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_location_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.action_anchor_gap_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "action anchor gap count stays within threshold",
          "actual": 0,
          "expected": {
            "max_action_anchor_gap_count": 0
          }
        },
        {
          "id": "text_quality.abstract_prose_risk_count",
          "stage": "screenplay",
          "status": "pass",
          "severity": "warn",
          "failure_type": "legacy_pressure_only",
          "track_view": "baseline",
          "message": "abstract prose risk count stays within threshold",
          "actual": 0,
          "expected": {
            "max_abstract_prose_risk_count": 0
          }
        },
        {
          "id": "dramart.upload_script_chars",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload script length meets minimum threshold",
          "actual": 38818,
          "expected": {
            "min_upload_script_chars": 2000
          }
        },
        {
          "id": "dramart.upload_ready_status",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.upload_ready_fail_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_upload_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.upload_ready_warn_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart upload-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_upload_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.asset_ready_status",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.asset_ready_fail_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_asset_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.asset_ready_warn_count",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart asset-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_asset_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.storyboard_ready_status",
          "stage": "storyboard",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready status is pass",
          "actual": "pass",
          "expected": {
            "status": "pass"
          }
        },
        {
          "id": "dramart.storyboard_ready_fail_count",
          "stage": "storyboard",
          "status": "pass",
          "severity": "error",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready fail count stays at zero",
          "actual": 0,
          "expected": {
            "max_storyboard_ready_fail_count": 0
          }
        },
        {
          "id": "dramart.storyboard_ready_warn_count",
          "stage": "storyboard",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "dramart storyboard-ready warn count stays at zero",
          "actual": 0,
          "expected": {
            "max_storyboard_ready_warn_count": 0
          }
        },
        {
          "id": "dramart.missing_character_bio_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing character bio ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_character_bio_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_visual_card_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing visual card ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_visual_card_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_voice_card_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing voice card ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_voice_card_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_asset_binding_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing asset binding ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_asset_binding_ratio": 0.05
          }
        },
        {
          "id": "dramart.missing_identity_summary_ratio",
          "stage": "dramart_package",
          "status": "pass",
          "severity": "warn",
          "failure_type": "platform_readiness_regression",
          "track_view": "delivery",
          "message": "missing identity summary ratio stays within threshold",
          "actual": 0.0,
          "expected": {
            "max_missing_identity_summary_ratio": 0.05
          }
        }
      ],
      "summary": {
        "check_count": 70,
        "failure_count": 0,
        "warning_count": 0,
        "delivery_failure_count": 0,
        "delivery_warning_count": 0,
        "baseline_failure_count": 0,
        "baseline_warning_count": 0,
        "failure_type_counts": {
          "delivery": {},
          "baseline": {}
        }
      },
      "top_issues": [],
      "recommendations": [],
      "status": "pass",
      "broad_status": "pass",
      "failure_buckets": {
        "delivery": {},
        "baseline": {}
      }
    },
    "product_quality": {
      "version": "screenplay_product_quality.v1",
      "generated_at": "2026-04-15T15:58:29.973511Z",
      "meta": {
        "run_dir": "/wwwb/aitools/writer/outputs/quality_gates/s6_step11_focus_recheck_v2/xiyouji_first10_now11_scriptfresh_20260406_v2_recheck_v2",
        "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": 9,
        "block_count": 57,
        "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": 10,
        "montage_tag_block_count": 3,
        "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": [
          {
            "episode_id": "EP0005",
            "block_id": "EP0005B002",
            "title": "【闪回】【蒙太奇】孙悟空与众猴开仙酒会",
            "lead_scene_id": "S0033",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（花果山）\n孙悟空逃回花果山与众猴讲述经历，孙悟空与众猴开仙酒会，七衣仙女向王母奏报蟠桃被偷，太上老君向玉帝奏报金丹失窃，赤脚大仙揭露孙悟空假传旨意。\n太上老君刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替太上老君把这句接过去。\n等众猴把话越压越实，场上的人便只剩点头附和的份；太上老君也只能赶紧把奉承话递上去。"
          },
          {
            "episode_id": "EP0009",
            "block_id": "EP0009B004",
            "title": "【闪回】【蒙太奇】太宗目睹十八层地狱惨状",
            "lead_scene_id": "S0068",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（奈河桥）\n太宗目睹十八层地狱惨状，奈河桥三桥对比，枉死城冤魂索命，借相良金银解围。\n唐太宗：门道先听清，后面的路才走得下去。\n太宗目睹十八层地狱惨状。\n奈河桥三桥对比。\n枉死城冤魂索命。\n借相良金银解围。\n太宗渡过阴山，观十八层地狱，过奈河桥，于枉死城遭冤魂索命，借相良金银方。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B002",
            "title": "【传闻】石猴带领众猴进入水帘洞",
            "lead_scene_id": "S0003",
            "presentation_mode": "dialogue",
            "time_modes": [
              "rumor"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:传闻"
            ],
            "screenplay_preview": "（水帘洞）\n美猴王把话往最难接的那层一压，周围的人都不敢轻易出声。\n美猴王刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替美猴王把这句接过去。\n等美猴王把话越压越实，场上的人便只剩点头附和的份。\n石猴带领众猴进入水帘洞。\n石猴称王并被尊为美猴王。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B003",
            "title": "【蒙太奇】众猴饯行盛宴",
            "lead_scene_id": "S0004",
            "presentation_mode": "montage",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（南赡部洲）\n众猴饯行盛宴，发现秀丽高山，美猴王独自登筏，驶向茫茫大海，美猴王独自登筏渡海，抵达南赡部洲并观察人世。\n众猴饯行盛宴，美猴王独自登筏渡海，抵达南赡部洲并观察人世，渡西海抵达西牛贺洲，发现秀丽高山。\n众猴饯行盛宴。\n发现秀丽高山。\n美猴王独自登筏，驶向茫茫大海。\n美猴王告别众猴，乘筏渡海至南赡部洲，后至西牛贺洲寻访神仙。"
          }
        ],
        "normal_blocks": [
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B001",
            "title": "仙石迸裂、石猴诞生",
            "lead_scene_id": "S0002",
            "presentation_mode": "action",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（灵霄宝殿）\n开篇诗，仙石迸裂、石猴诞生，石猴目运金光，金光惊动天庭，玉帝命千里眼顺风耳探查。\n开篇诗。\n玉帝命千里眼顺风耳探查。\n仙石迸裂、石猴诞生。\n石猴跳入瀑布，发现水帘洞，这不仅是地理上的发现。\n开篇诗与天地开辟，花果山仙石迸裂产石猴，目运金光惊动玉帝。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B004",
            "title": "美猴王在山中听到歌声，循声发现一砍柴樵夫。",
            "lead_scene_id": "S0005",
            "presentation_mode": "dialogue",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（南赡部洲）\n石猴闻歌寻声，樵夫歌唱《满庭芳》，石猴误认樵夫为神仙，樵夫解释歌谣来源。\n美猴王：神仙。\n石猴闻歌寻声。\n樵夫歌唱《满庭芳》。\n石猴误认樵夫为神仙。\n樵夫解释歌谣来源。"
          }
        ]
      },
      "writing_strategy": {
        "status": "pass",
        "block_count": 57,
        "pass_block_count": 57,
        "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": "pass",
        "upload_ready": true,
        "asset_ready": true,
        "storyboard_ready": "unknown",
        "upload_script_char_count": 38818,
        "upload_script_line_count": 1017,
        "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- 如来（剧本中亦作：佛老 / 佛祖 / 释迦牟尼尊者）…"
      },
      "prompt_guard": {
        "shot_count": 223,
        "issue_count": 33,
        "delivery_fix_queue_size": 26,
        "text_quality_acceptance_status": "fail",
        "tri_layer_acceptance_status": "warning",
        "dramart_delivery_acceptance_status": "fail"
      },
      "spot_check": {
        "risk_blocks": [
          {
            "episode_id": "EP0005",
            "block_id": "EP0005B002",
            "title": "【闪回】【蒙太奇】孙悟空与众猴开仙酒会",
            "lead_scene_id": "S0033",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（花果山）\n孙悟空逃回花果山与众猴讲述经历，孙悟空与众猴开仙酒会，七衣仙女向王母奏报蟠桃被偷，太上老君向玉帝奏报金丹失窃，赤脚大仙揭露孙悟空假传旨意。\n太上老君刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替太上老君把这句接过去。\n等众猴把话越压越实，场上的人便只剩点头附和的份；太上老君也只能赶紧把奉承话递上去。"
          },
          {
            "episode_id": "EP0009",
            "block_id": "EP0009B004",
            "title": "【闪回】【蒙太奇】太宗目睹十八层地狱惨状",
            "lead_scene_id": "S0068",
            "presentation_mode": "montage",
            "time_modes": [
              "flashback"
            ],
            "reason_count": 2,
            "reasons": [
              "special_tag:闪回",
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（奈河桥）\n太宗目睹十八层地狱惨状，奈河桥三桥对比，枉死城冤魂索命，借相良金银解围。\n唐太宗：门道先听清，后面的路才走得下去。\n太宗目睹十八层地狱惨状。\n奈河桥三桥对比。\n枉死城冤魂索命。\n借相良金银解围。\n太宗渡过阴山，观十八层地狱，过奈河桥，于枉死城遭冤魂索命，借相良金银方。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B002",
            "title": "【传闻】石猴带领众猴进入水帘洞",
            "lead_scene_id": "S0003",
            "presentation_mode": "dialogue",
            "time_modes": [
              "rumor"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:传闻"
            ],
            "screenplay_preview": "（水帘洞）\n美猴王把话往最难接的那层一压，周围的人都不敢轻易出声。\n美猴王刚一张口就卡住，席上的笑意也跟着停了一瞬。\n桌边几个人都端着杯盏陪坐着，谁也不肯替美猴王把这句接过去。\n等美猴王把话越压越实，场上的人便只剩点头附和的份。\n石猴带领众猴进入水帘洞。\n石猴称王并被尊为美猴王。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B003",
            "title": "【蒙太奇】众猴饯行盛宴",
            "lead_scene_id": "S0004",
            "presentation_mode": "montage",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 1,
            "reasons": [
              "special_tag:蒙太奇"
            ],
            "screenplay_preview": "（南赡部洲）\n众猴饯行盛宴，发现秀丽高山，美猴王独自登筏，驶向茫茫大海，美猴王独自登筏渡海，抵达南赡部洲并观察人世。\n众猴饯行盛宴，美猴王独自登筏渡海，抵达南赡部洲并观察人世，渡西海抵达西牛贺洲，发现秀丽高山。\n众猴饯行盛宴。\n发现秀丽高山。\n美猴王独自登筏，驶向茫茫大海。\n美猴王告别众猴，乘筏渡海至南赡部洲，后至西牛贺洲寻访神仙。"
          }
        ],
        "normal_blocks": [
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B001",
            "title": "仙石迸裂、石猴诞生",
            "lead_scene_id": "S0002",
            "presentation_mode": "action",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（灵霄宝殿）\n开篇诗，仙石迸裂、石猴诞生，石猴目运金光，金光惊动天庭，玉帝命千里眼顺风耳探查。\n开篇诗。\n玉帝命千里眼顺风耳探查。\n仙石迸裂、石猴诞生。\n石猴跳入瀑布，发现水帘洞，这不仅是地理上的发现。\n开篇诗与天地开辟，花果山仙石迸裂产石猴，目运金光惊动玉帝。"
          },
          {
            "episode_id": "EP0001",
            "block_id": "EP0001B004",
            "title": "美猴王在山中听到歌声，循声发现一砍柴樵夫。",
            "lead_scene_id": "S0005",
            "presentation_mode": "dialogue",
            "time_modes": [
              "mainline"
            ],
            "reason_count": 0,
            "reasons": [],
            "screenplay_preview": "（南赡部洲）\n石猴闻歌寻声，樵夫歌唱《满庭芳》，石猴误认樵夫为神仙，樵夫解释歌谣来源。\n美猴王：神仙。\n石猴闻歌寻声。\n樵夫歌唱《满庭芳》。\n石猴误认樵夫为神仙。\n樵夫解释歌谣来源。"
          }
        ],
        "recommended_manual_sample_count": 6
      },
      "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": 38818,
          "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": "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"
        }
      ]
    }
  }
}