{
  "version": "kg_quality_gate.v1",
  "generated_at": "2026-03-28T13:34:41.049877Z",
  "profile": "current_chain",
  "candidate_run_dir": "outputs/daozu_kg_current_chain_30_20260328_v1",
  "baseline_run_dir": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix",
  "gate_config": {
    "phase1": {
      "max_run_errors": 0,
      "require_stage_status_ok": true,
      "stage_status": {
        "required_stages": [
          "chunks",
          "ontology",
          "kg",
          "closure_fix",
          "type_consolidation"
        ]
      },
      "chunks": {
        "min_chunks": 1,
        "oversize_tolerance_chars": 80,
        "max_oversize_ratio": 0.0,
        "min_avg_fill_ratio": 0.55
      },
      "ontology": {
        "min_samples": 1,
        "min_candidate_entity_types": 3,
        "min_candidate_relation_types": 3,
        "min_entity_taxonomy": 8,
        "min_relation_taxonomy": 4
      },
      "kg": {
        "min_entities_per_chunk": 1.0,
        "min_relations_per_chunk": 1.0,
        "min_observations_per_chunk": 8.0,
        "max_ambiguous_entity_forks": 24,
        "max_ambiguous_entity_forks_per_chunk": 0.7,
        "require_ontology_loaded": true,
        "min_supplement_ratio_when_high_density": 0.3
      },
      "type_consolidation": {
        "max_other_after_abs": 3,
        "max_other_after_ratio": 0.2,
        "require_not_worse_than_before": true
      },
      "baseline_diff": {
        "min_relations_delta_pct": -20.0,
        "min_observations_delta_pct": -20.0,
        "max_other_after_delta": 1,
        "max_llm_calls_delta_pct": 50.0,
        "max_run_errors_delta": 0
      },
      "golden_manifest": {
        "min_match_ratio": 1.0,
        "allow_missing_chunks": false
      }
    },
    "kg_lite": {
      "enabled": true,
      "require_stage_status_ok": true,
      "require_artifacts": true,
      "min_kept_entities": 1,
      "min_kept_relations": 1,
      "require_not_exceed_source": true,
      "require_decisions_payload": true,
      "require_source_paths": true,
      "require_summary_store_alignment": true
    },
    "fix_only": {
      "enabled": false,
      "expected_start_stage": "closure_fix",
      "expected_stop_stage": "type_consolidation",
      "expected_stage_rows": [
        "closure_fix",
        "type_consolidation"
      ],
      "require_manifest_bounds": true,
      "require_exact_stage_rows": true,
      "require_zero_llm_calls": true,
      "require_zero_run_errors": true
    }
  },
  "candidate": {
    "summary": {
      "run_dir": "daozu_kg_current_chain_30_20260328_v1",
      "run_id": "20260328T125822484685Z",
      "created_at": "2026-03-28T12:58:22.508753Z",
      "out_dir": "outputs/daozu_kg_current_chain_30_20260328_v1",
      "input_path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
      "input_sha256": "5c05796b90b9a1956f3fe767cd8288965db478acac5dbed44f64419f0fea185d",
      "provider": "deepseek",
      "video_provider": "doubao",
      "enable_video": false,
      "style_preset": "电影化叙事，细节清晰，角色形象一致，光照连续",
      "limits": {
        "max_chars": 1800,
        "limit_chunks": 30,
        "limit_scenes": null,
        "limit_shots": null
      },
      "status": "ok",
      "errors": 0,
      "counts": {
        "chunks": 30,
        "ontology_samples": 30,
        "ontology_candidate_entity_types": 7,
        "ontology_candidate_relation_types": 8,
        "ontology_entity_taxonomy": 13,
        "ontology_relation_taxonomy": 8,
        "observations": 664,
        "entities": 114,
        "relations": 156,
        "type_candidates": 80,
        "type_apply_type_count": 8,
        "type_apply_subtype_count": 24,
        "type_other_before": 9,
        "type_other_after": 1,
        "entity_registry_entities": 0,
        "entity_visual_cards": 0,
        "entity_voice_cards": 0,
        "entity_asset_bindings": 0,
        "scenes": 0,
        "chronology_scenes": 0,
        "chronology_groups": 0,
        "chronology_edges": 0,
        "chronology_conflicts": 0,
        "adaptation_scenes": 0,
        "adaptation_groups": 0,
        "adaptation_beats": 0,
        "adaptation_retain_scenes": 0,
        "adaptation_compress_scenes": 0,
        "adaptation_bridge_scenes": 0,
        "adaptation_drop_scenes": 0,
        "scripts": 0,
        "shots": 0,
        "style_fixed_positive_terms": 0,
        "style_fixed_negative_terms": 0,
        "style_provider_profiles": 0,
        "style_manual_override_slots": 0,
        "style_reference_ready_entities": 0,
        "storyboards": 0,
        "prompt_guard_shots": 0,
        "prompt_guard_pass_shots": 0,
        "prompt_guard_warning_shots": 0,
        "prompt_guard_fail_shots": 0,
        "prompt_guard_issue_count": 0,
        "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",
        "scripts": "04_scripts.json",
        "style_bible": "04b_style_bible.json",
        "storyboard": "05_storyboard.json",
        "prompt_guard": "05b_storyboard_guard.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"
      },
      "updated_at": "2026-03-28T13:34:41.038064Z",
      "run_uid": "20260328T125822484685Z",
      "run_key": "20260328T125822484685Z",
      "trace_scope": "live",
      "is_current_live": true,
      "archive_rel": "",
      "web_paths": {
        "run_root": "",
        "logs_dir": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/",
        "llm_dir": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/llm/",
        "manifest": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/run_manifest.json",
        "project": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/project.json",
        "report_html": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_report.html",
        "report_md": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_report.md",
        "metrics": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_metrics.json",
        "events": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_events.jsonl",
        "errors": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_errors.jsonl",
        "stage_timings": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/stage_timings.jsonl",
        "llm_calls": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/llm_calls.jsonl"
      }
    },
    "counts": {
      "chunks": 30,
      "ontology_samples": 30,
      "ontology_candidate_entity_types": 7,
      "ontology_candidate_relation_types": 8,
      "ontology_entity_taxonomy": 13,
      "ontology_relation_taxonomy": 8,
      "observations": 664,
      "entities": 114,
      "relations": 156,
      "type_candidates": 80,
      "type_apply_type_count": 8,
      "type_apply_subtype_count": 24,
      "type_other_before": 9,
      "type_other_after": 1,
      "entity_registry_entities": 0,
      "entity_visual_cards": 0,
      "entity_voice_cards": 0,
      "entity_asset_bindings": 0,
      "scenes": 0,
      "chronology_scenes": 0,
      "chronology_groups": 0,
      "chronology_edges": 0,
      "chronology_conflicts": 0,
      "adaptation_scenes": 0,
      "adaptation_groups": 0,
      "adaptation_beats": 0,
      "adaptation_retain_scenes": 0,
      "adaptation_compress_scenes": 0,
      "adaptation_bridge_scenes": 0,
      "adaptation_drop_scenes": 0,
      "scripts": 0,
      "shots": 0,
      "style_fixed_positive_terms": 0,
      "style_fixed_negative_terms": 0,
      "style_provider_profiles": 0,
      "style_manual_override_slots": 0,
      "style_reference_ready_entities": 0,
      "storyboards": 0,
      "prompt_guard_shots": 0,
      "prompt_guard_pass_shots": 0,
      "prompt_guard_warning_shots": 0,
      "prompt_guard_fail_shots": 0,
      "prompt_guard_issue_count": 0,
      "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,
      "llm_calls": 40,
      "run_errors": 0
    },
    "stage_rows": [
      {
        "ts_start": "2026-03-28T12:58:27.290633Z",
        "ts_end": "2026-03-28T12:58:28.122900Z",
        "duration_sec": 0.832,
        "stage": "chunks",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Ingestion & Chunking Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
            "kind": "novel_text"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
            "kind": "chunks"
          }
        ],
        "metrics": {
          "chunks": 30,
          "max_chars": 1800,
          "limit_chunks": 30,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T12:58:28.141287Z",
        "ts_end": "2026-03-28T12:58:28.268680Z",
        "duration_sec": 0.127,
        "stage": "ontology",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Ontology & Taxonomy Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
            "kind": "chunks"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01b_ontology_samples.json",
            "kind": "ontology_samples"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01c_ontology_candidates.json",
            "kind": "ontology_candidates"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "metrics": {
          "samples": 30,
          "candidate_entity_types": 7,
          "candidate_relation_types": 8,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 8,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T12:58:28.288608Z",
        "ts_end": "2026-03-28T13:31:57.335982Z",
        "duration_sec": 2009.047,
        "stage": "kg",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Knowledge Graph Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
            "kind": "chunks"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg.json",
            "kind": "kg_summary"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
            "kind": "kg_store"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_observations.jsonl",
            "kind": "kg_observations"
          }
        ],
        "metrics": {
          "entities": 114,
          "relations": 156,
          "observations": 664,
          "ambiguous_entity_forks": 9,
          "chunks": 30,
          "ontology_loaded": true,
          "high_density_chunks": 12,
          "supplement_chunks": 10,
          "max_entity_limit": 14,
          "max_relation_limit": 14,
          "kg_window_size": 1,
          "kg_window_concurrency": 1,
          "kg_warmup_chunks": 30,
          "kg_window_batches": 0,
          "kg_parallel_chunks": 0,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T13:31:57.369574Z",
        "ts_end": "2026-03-28T13:31:57.705166Z",
        "duration_sec": 0.336,
        "stage": "closure_fix",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Contextual Closure & Cleanup Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
            "kind": "kg_store"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_observations.jsonl",
            "kind": "kg_observations"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure.json",
            "kind": "kg_summary_closure"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
            "kind": "kg_store_closure"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure_decisions.json",
            "kind": "kg_closure_decisions"
          }
        ],
        "metrics": {
          "entities": 112,
          "relations": 155,
          "closure_decision_count": 2,
          "closure_drop_count": 0,
          "closure_merge_count": 2,
          "stub_cleanup_dropped_entities": 0,
          "stub_cleanup_dropped_relations": 0,
          "stub_cleanup_merged_duplicate_entities": 0,
          "stub_cleanup_merged_same_name_entities": 0,
          "stub_cleanup_merged_duplicate_relations": 1,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T13:31:57.736035Z",
        "ts_end": "2026-03-28T13:31:57.904607Z",
        "duration_sec": 0.169,
        "stage": "type_consolidation",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Ontology & Taxonomy Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
            "kind": "kg_store_closure"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02b_type_candidates.json",
            "kind": "type_candidates"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02c_type_consolidation.json",
            "kind": "type_consolidation"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          }
        ],
        "metrics": {
          "candidates": 80,
          "apply_type_count": 8,
          "apply_subtype_count": 24,
          "review_type_count": 11,
          "review_subtype_count": 28,
          "other_before": 9,
          "other_after": 1,
          "ontology_loaded": true,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T13:31:57.942860Z",
        "ts_end": "2026-03-28T13:31:58.045241Z",
        "duration_sec": 0.102,
        "stage": "kg_lite",
        "status": "ok",
        "run_id": "20260328T125822484685Z",
        "agent": "Knowledge Graph Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          }
        ],
        "outputs": [
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite.json",
            "kind": "kg_lite"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite_store.json",
            "kind": "kg_lite_store"
          },
          {
            "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite_decisions.json",
            "kind": "kg_lite_decisions"
          }
        ],
        "metrics": {
          "input_entities": 112,
          "input_relations": 155,
          "kept_entities": 111,
          "kept_relations": 154,
          "dropped_entities": 1,
          "dropped_relations": 1,
          "resumed": false
        }
      }
    ],
    "stage_metrics": {
      "chunks": {
        "status": "ok",
        "duration_sec": 0.832,
        "metrics": {
          "chunks": 30,
          "max_chars": 1800,
          "limit_chunks": 30,
          "resumed": false
        }
      },
      "ontology": {
        "status": "ok",
        "duration_sec": 0.127,
        "metrics": {
          "samples": 30,
          "candidate_entity_types": 7,
          "candidate_relation_types": 8,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 8,
          "resumed": false
        }
      },
      "kg": {
        "status": "ok",
        "duration_sec": 2009.047,
        "metrics": {
          "entities": 114,
          "relations": 156,
          "observations": 664,
          "ambiguous_entity_forks": 9,
          "chunks": 30,
          "ontology_loaded": true,
          "high_density_chunks": 12,
          "supplement_chunks": 10,
          "max_entity_limit": 14,
          "max_relation_limit": 14,
          "kg_window_size": 1,
          "kg_window_concurrency": 1,
          "kg_warmup_chunks": 30,
          "kg_window_batches": 0,
          "kg_parallel_chunks": 0,
          "resumed": false
        }
      },
      "closure_fix": {
        "status": "ok",
        "duration_sec": 0.336,
        "metrics": {
          "entities": 112,
          "relations": 155,
          "closure_decision_count": 2,
          "closure_drop_count": 0,
          "closure_merge_count": 2,
          "stub_cleanup_dropped_entities": 0,
          "stub_cleanup_dropped_relations": 0,
          "stub_cleanup_merged_duplicate_entities": 0,
          "stub_cleanup_merged_same_name_entities": 0,
          "stub_cleanup_merged_duplicate_relations": 1,
          "resumed": false
        }
      },
      "type_consolidation": {
        "status": "ok",
        "duration_sec": 0.169,
        "metrics": {
          "candidates": 80,
          "apply_type_count": 8,
          "apply_subtype_count": 24,
          "review_type_count": 11,
          "review_subtype_count": 28,
          "other_before": 9,
          "other_after": 1,
          "ontology_loaded": true,
          "resumed": false
        }
      },
      "kg_lite": {
        "status": "ok",
        "duration_sec": 0.102,
        "metrics": {
          "input_entities": 112,
          "input_relations": 155,
          "kept_entities": 111,
          "kept_relations": 154,
          "dropped_entities": 1,
          "dropped_relations": 1,
          "resumed": false
        }
      }
    },
    "quality_metrics": {
      "chunks": {
        "chunk_count": 30,
        "avg_chunk_chars": 1737.133,
        "max_chunk_chars": 1800,
        "avg_fill_ratio": 0.965074,
        "oversize_chunks": 0
      },
      "ontology": {
        "sample_count": 30,
        "sample_coverage_ratio": 1.0,
        "candidate_entity_types": 7,
        "candidate_relation_types": 8,
        "taxonomy_entity_types": 13,
        "taxonomy_relations": 8
      },
      "kg": {
        "entity_count": 114,
        "relation_count": 156,
        "observation_count": 664,
        "entity_per_chunk": 3.8,
        "relation_per_chunk": 5.2,
        "observation_per_chunk": 22.133333,
        "ambiguous_entity_forks": 9,
        "supplement_ratio": 0.833333,
        "ontology_loaded": true
      },
      "type_consolidation": {
        "candidate_count": 80,
        "auto_apply_total": 32,
        "review_total": 39,
        "other_before": 9,
        "other_after": 1,
        "other_reduction": 8,
        "other_reduction_ratio": 0.888889,
        "ontology_loaded": true
      }
    }
  },
  "candidate_validation": {
    "artifact_paths": {
      "chunks": "outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
      "ontology_samples": "outputs/daozu_kg_current_chain_30_20260328_v1/01b_ontology_samples.json",
      "ontology_candidates": "outputs/daozu_kg_current_chain_30_20260328_v1/01c_ontology_candidates.json",
      "ontology_doc": "outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
      "kg_store": "outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
      "kg_summary": "outputs/daozu_kg_current_chain_30_20260328_v1/02_kg.json",
      "kg_store_closure": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
      "kg_summary_closure": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure.json",
      "kg_closure_decisions": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure_decisions.json",
      "type_candidates": "outputs/daozu_kg_current_chain_30_20260328_v1/02b_type_candidates.json",
      "type_consolidation": "outputs/daozu_kg_current_chain_30_20260328_v1/02c_type_consolidation.json"
    },
    "missing": [],
    "errors": {
      "chunks": [],
      "ontology_samples": [],
      "ontology_candidates": [],
      "ontology_doc": [],
      "kg_store": [],
      "kg_summary": [],
      "kg_store_closure": [],
      "kg_summary_closure": [],
      "kg_closure_decisions": [],
      "type_candidates": [],
      "type_consolidation": []
    },
    "is_valid": true
  },
  "checks": [
    {
      "id": "schema.candidate",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "phase-1 candidate artifacts passed schema validation",
      "actual": null,
      "expected": null
    },
    {
      "id": "run.errors",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "run error count is within gate threshold",
      "actual": 0,
      "expected": {
        "max_run_errors": 0
      }
    },
    {
      "id": "stage_status.chunks",
      "stage": "chunks",
      "status": "pass",
      "severity": "error",
      "message": "chunks stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "stage_status.ontology",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "ontology stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "stage_status.kg",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "kg stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "stage_status.closure_fix",
      "stage": "closure_fix",
      "status": "pass",
      "severity": "error",
      "message": "closure_fix stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "stage_status.type_consolidation",
      "stage": "type_consolidation",
      "status": "pass",
      "severity": "error",
      "message": "type_consolidation stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "chunks.count",
      "stage": "chunks",
      "status": "pass",
      "severity": "error",
      "message": "chunk count meets minimum threshold",
      "actual": 30,
      "expected": {
        "min_chunks": 1
      }
    },
    {
      "id": "chunks.oversize_ratio",
      "stage": "chunks",
      "status": "pass",
      "severity": "error",
      "message": "oversize chunks stay within threshold",
      "actual": {
        "oversize_count": 0,
        "oversize_ratio": 0.0,
        "max_chars": 1800,
        "tolerance": 80
      },
      "expected": {
        "max_oversize_ratio": 0.0
      }
    },
    {
      "id": "chunks.avg_fill_ratio",
      "stage": "chunks",
      "status": "pass",
      "severity": "warn",
      "message": "average chunk fill ratio looks healthy",
      "actual": 0.965074,
      "expected": {
        "min_avg_fill_ratio": 0.55
      }
    },
    {
      "id": "ontology.samples",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "samples meets minimum threshold",
      "actual": 30,
      "expected": {
        "min": 1
      }
    },
    {
      "id": "ontology.candidate_entity_types",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "candidate_entity_types meets minimum threshold",
      "actual": 7,
      "expected": {
        "min": 3
      }
    },
    {
      "id": "ontology.candidate_relation_types",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "candidate_relation_types meets minimum threshold",
      "actual": 8,
      "expected": {
        "min": 3
      }
    },
    {
      "id": "ontology.entity_taxonomy",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "entity_taxonomy meets minimum threshold",
      "actual": 13,
      "expected": {
        "min": 8
      }
    },
    {
      "id": "ontology.relation_taxonomy",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "relation_taxonomy meets minimum threshold",
      "actual": 8,
      "expected": {
        "min": 4
      }
    },
    {
      "id": "kg.entities_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "entities_per_chunk meets minimum threshold",
      "actual": 3.8,
      "expected": {
        "min": 1.0
      }
    },
    {
      "id": "kg.relations_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "relations_per_chunk meets minimum threshold",
      "actual": 5.2,
      "expected": {
        "min": 1.0
      }
    },
    {
      "id": "kg.observations_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "observations_per_chunk meets minimum threshold",
      "actual": 22.133333,
      "expected": {
        "min": 8.0
      }
    },
    {
      "id": "kg.ambiguous_entity_forks",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "ambiguous entity forks stay within threshold",
      "actual": 9,
      "expected": {
        "max": 21,
        "max_abs": 24,
        "max_per_chunk": 0.7
      }
    },
    {
      "id": "kg.ontology_loaded",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "kg stage loaded ontology constraints",
      "actual": true,
      "expected": true
    },
    {
      "id": "kg.supplement_ratio",
      "stage": "kg",
      "status": "pass",
      "severity": "warn",
      "message": "high-density chunks triggered supplement extraction often enough",
      "actual": {
        "high_density_chunks": 12,
        "supplement_chunks": 10,
        "ratio": 0.833333
      },
      "expected": {
        "min_ratio": 0.3
      }
    },
    {
      "id": "type.other_not_worse",
      "stage": "type_consolidation",
      "status": "pass",
      "severity": "error",
      "message": "type consolidation does not increase '其他'",
      "actual": {
        "other_before": 9,
        "other_after": 1
      },
      "expected": "other_after <= other_before"
    },
    {
      "id": "type.other_after_limit",
      "stage": "type_consolidation",
      "status": "pass",
      "severity": "error",
      "message": "post-consolidation '其他' count stays within threshold",
      "actual": 1,
      "expected": {
        "max": 3,
        "max_abs": 3,
        "max_ratio": 0.2
      }
    },
    {
      "id": "baseline.relations_delta_pct",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "relations delta stays within regression threshold",
      "actual": -7.143,
      "expected": {
        "min_relations_delta_pct": -20.0
      }
    },
    {
      "id": "baseline.observations_delta_pct",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "observations delta stays within regression threshold",
      "actual": 4.239,
      "expected": {
        "min_observations_delta_pct": -20.0
      }
    },
    {
      "id": "baseline.type_other_after_delta",
      "stage": "type_consolidation",
      "status": "pass",
      "severity": "error",
      "message": "type_consolidation other_after did not regress materially",
      "actual": 1,
      "expected": {
        "max_delta": 1
      }
    },
    {
      "id": "baseline.llm_calls_delta_pct",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "llm_calls growth stays within threshold",
      "actual": 5.263,
      "expected": {
        "max_delta_pct": 50.0
      }
    },
    {
      "id": "baseline.run_errors_delta",
      "stage": "phase1",
      "status": "pass",
      "severity": "error",
      "message": "run_errors did not regress",
      "actual": 0,
      "expected": {
        "max_delta": 0
      }
    },
    {
      "id": "kg_lite.artifacts",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite artifacts are present",
      "actual": {
        "missing": []
      },
      "expected": [
        "summary",
        "store",
        "decisions"
      ]
    },
    {
      "id": "stage_status.kg_lite",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite stage completed with status ok",
      "actual": "ok",
      "expected": "ok"
    },
    {
      "id": "kg_lite.schema.summary",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "02i_kg_lite.json passed schema validation",
      "actual": [],
      "expected": "schema valid"
    },
    {
      "id": "kg_lite.schema.store",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "02i_kg_lite_store.json passed schema validation",
      "actual": [],
      "expected": "schema valid"
    },
    {
      "id": "kg_lite.schema.decisions",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "02i_kg_lite_decisions.json passed schema validation",
      "actual": [],
      "expected": "schema valid"
    },
    {
      "id": "kg_lite.kept_entities",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite kept enough entities",
      "actual": 111,
      "expected": {
        "min_kept_entities": 1
      }
    },
    {
      "id": "kg_lite.kept_relations",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite kept enough relations",
      "actual": 154,
      "expected": {
        "min_kept_relations": 1
      }
    },
    {
      "id": "kg_lite.entity_count_alignment",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite summary/store entity counts align",
      "actual": {
        "summary_entity_count": 111,
        "store_entity_count": 111
      },
      "expected": "summary_entity_count == store_entity_count"
    },
    {
      "id": "kg_lite.relation_count_alignment",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite summary/store relation counts align",
      "actual": {
        "summary_relation_count": 154,
        "store_relation_count": 154
      },
      "expected": "summary_relation_count == store_relation_count"
    },
    {
      "id": "kg_lite.entity_count_within_source",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite entity count stays within source KG",
      "actual": 111,
      "expected": {
        "max_source_entities": 112
      }
    },
    {
      "id": "kg_lite.relation_count_within_source",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite relation count stays within source KG",
      "actual": 154,
      "expected": {
        "max_source_relations": 155
      }
    },
    {
      "id": "kg_lite.decisions.cover_input_entities",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite decisions cover all input entities",
      "actual": 112,
      "expected": {
        "input_entity_count": 112
      }
    },
    {
      "id": "kg_lite.decisions.cover_input_relations",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite decisions cover all input relations",
      "actual": 155,
      "expected": {
        "input_relation_count": 155
      }
    },
    {
      "id": "kg_lite.source_paths",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite artifacts keep source KG provenance",
      "actual": {
        "source_kg_path": "02d_kg_consolidated.json",
        "source_kg_store_path": "02d_kg_store_consolidated.json"
      },
      "expected": "source_kg_path and source_kg_store_path present"
    }
  ],
  "summary": {
    "check_count": 42,
    "failure_count": 0,
    "warning_count": 0
  },
  "phase1_gate": {
    "status": "pass",
    "summary": {
      "check_count": 28,
      "failure_count": 0,
      "warning_count": 0
    }
  },
  "regression_report": {
    "version": "1.0",
    "generated_at": "2026-03-28T13:34:40.987524Z",
    "candidate": {
      "summary": {
        "run_dir": "daozu_kg_current_chain_30_20260328_v1",
        "run_id": "20260328T125822484685Z",
        "created_at": "2026-03-28T12:58:22.508753Z",
        "out_dir": "outputs/daozu_kg_current_chain_30_20260328_v1",
        "input_path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
        "input_sha256": "5c05796b90b9a1956f3fe767cd8288965db478acac5dbed44f64419f0fea185d",
        "provider": "deepseek",
        "video_provider": "doubao",
        "enable_video": false,
        "style_preset": "电影化叙事，细节清晰，角色形象一致，光照连续",
        "limits": {
          "max_chars": 1800,
          "limit_chunks": 30,
          "limit_scenes": null,
          "limit_shots": null
        },
        "status": "ok",
        "errors": 0,
        "counts": {
          "chunks": 30,
          "ontology_samples": 30,
          "ontology_candidate_entity_types": 7,
          "ontology_candidate_relation_types": 8,
          "ontology_entity_taxonomy": 13,
          "ontology_relation_taxonomy": 8,
          "observations": 664,
          "entities": 114,
          "relations": 156,
          "type_candidates": 80,
          "type_apply_type_count": 8,
          "type_apply_subtype_count": 24,
          "type_other_before": 9,
          "type_other_after": 1,
          "entity_registry_entities": 0,
          "entity_visual_cards": 0,
          "entity_voice_cards": 0,
          "entity_asset_bindings": 0,
          "scenes": 0,
          "chronology_scenes": 0,
          "chronology_groups": 0,
          "chronology_edges": 0,
          "chronology_conflicts": 0,
          "adaptation_scenes": 0,
          "adaptation_groups": 0,
          "adaptation_beats": 0,
          "adaptation_retain_scenes": 0,
          "adaptation_compress_scenes": 0,
          "adaptation_bridge_scenes": 0,
          "adaptation_drop_scenes": 0,
          "scripts": 0,
          "shots": 0,
          "style_fixed_positive_terms": 0,
          "style_fixed_negative_terms": 0,
          "style_provider_profiles": 0,
          "style_manual_override_slots": 0,
          "style_reference_ready_entities": 0,
          "storyboards": 0,
          "prompt_guard_shots": 0,
          "prompt_guard_pass_shots": 0,
          "prompt_guard_warning_shots": 0,
          "prompt_guard_fail_shots": 0,
          "prompt_guard_issue_count": 0,
          "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",
          "scripts": "04_scripts.json",
          "style_bible": "04b_style_bible.json",
          "storyboard": "05_storyboard.json",
          "prompt_guard": "05b_storyboard_guard.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"
        },
        "updated_at": "2026-03-28T13:34:40.973444Z",
        "run_uid": "20260328T125822484685Z",
        "run_key": "20260328T125822484685Z",
        "trace_scope": "live",
        "is_current_live": true,
        "archive_rel": "",
        "web_paths": {
          "run_root": "",
          "logs_dir": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/",
          "llm_dir": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/llm/",
          "manifest": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/run_manifest.json",
          "project": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/project.json",
          "report_html": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_report.html",
          "report_md": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_report.md",
          "metrics": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_metrics.json",
          "events": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_events.jsonl",
          "errors": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/run_errors.jsonl",
          "stage_timings": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/stage_timings.jsonl",
          "llm_calls": "/novel2video/runs/daozu_kg_current_chain_30_20260328_v1/logs/llm_calls.jsonl"
        }
      },
      "counts": {
        "chunks": 30,
        "ontology_samples": 30,
        "ontology_candidate_entity_types": 7,
        "ontology_candidate_relation_types": 8,
        "ontology_entity_taxonomy": 13,
        "ontology_relation_taxonomy": 8,
        "observations": 664,
        "entities": 114,
        "relations": 156,
        "type_candidates": 80,
        "type_apply_type_count": 8,
        "type_apply_subtype_count": 24,
        "type_other_before": 9,
        "type_other_after": 1,
        "entity_registry_entities": 0,
        "entity_visual_cards": 0,
        "entity_voice_cards": 0,
        "entity_asset_bindings": 0,
        "scenes": 0,
        "chronology_scenes": 0,
        "chronology_groups": 0,
        "chronology_edges": 0,
        "chronology_conflicts": 0,
        "adaptation_scenes": 0,
        "adaptation_groups": 0,
        "adaptation_beats": 0,
        "adaptation_retain_scenes": 0,
        "adaptation_compress_scenes": 0,
        "adaptation_bridge_scenes": 0,
        "adaptation_drop_scenes": 0,
        "scripts": 0,
        "shots": 0,
        "style_fixed_positive_terms": 0,
        "style_fixed_negative_terms": 0,
        "style_provider_profiles": 0,
        "style_manual_override_slots": 0,
        "style_reference_ready_entities": 0,
        "storyboards": 0,
        "prompt_guard_shots": 0,
        "prompt_guard_pass_shots": 0,
        "prompt_guard_warning_shots": 0,
        "prompt_guard_fail_shots": 0,
        "prompt_guard_issue_count": 0,
        "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,
        "llm_calls": 40,
        "run_errors": 0
      },
      "stage_rows": [
        {
          "ts_start": "2026-03-28T12:58:27.290633Z",
          "ts_end": "2026-03-28T12:58:28.122900Z",
          "duration_sec": 0.832,
          "stage": "chunks",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Ingestion & Chunking Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
              "kind": "novel_text"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
              "kind": "chunks"
            }
          ],
          "metrics": {
            "chunks": 30,
            "max_chars": 1800,
            "limit_chunks": 30,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-28T12:58:28.141287Z",
          "ts_end": "2026-03-28T12:58:28.268680Z",
          "duration_sec": 0.127,
          "stage": "ontology",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Ontology & Taxonomy Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
              "kind": "chunks"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01b_ontology_samples.json",
              "kind": "ontology_samples"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01c_ontology_candidates.json",
              "kind": "ontology_candidates"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "metrics": {
            "samples": 30,
            "candidate_entity_types": 7,
            "candidate_relation_types": 8,
            "taxonomy_entity_types": 13,
            "taxonomy_relations": 8,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-28T12:58:28.288608Z",
          "ts_end": "2026-03-28T13:31:57.335982Z",
          "duration_sec": 2009.047,
          "stage": "kg",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Knowledge Graph Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
              "kind": "chunks"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg.json",
              "kind": "kg_summary"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
              "kind": "kg_store"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_observations.jsonl",
              "kind": "kg_observations"
            }
          ],
          "metrics": {
            "entities": 114,
            "relations": 156,
            "observations": 664,
            "ambiguous_entity_forks": 9,
            "chunks": 30,
            "ontology_loaded": true,
            "high_density_chunks": 12,
            "supplement_chunks": 10,
            "max_entity_limit": 14,
            "max_relation_limit": 14,
            "kg_window_size": 1,
            "kg_window_concurrency": 1,
            "kg_warmup_chunks": 30,
            "kg_window_batches": 0,
            "kg_parallel_chunks": 0,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-28T13:31:57.369574Z",
          "ts_end": "2026-03-28T13:31:57.705166Z",
          "duration_sec": 0.336,
          "stage": "closure_fix",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Contextual Closure & Cleanup Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
              "kind": "kg_store"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_observations.jsonl",
              "kind": "kg_observations"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure.json",
              "kind": "kg_summary_closure"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
              "kind": "kg_store_closure"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure_decisions.json",
              "kind": "kg_closure_decisions"
            }
          ],
          "metrics": {
            "entities": 112,
            "relations": 155,
            "closure_decision_count": 2,
            "closure_drop_count": 0,
            "closure_merge_count": 2,
            "stub_cleanup_dropped_entities": 0,
            "stub_cleanup_dropped_relations": 0,
            "stub_cleanup_merged_duplicate_entities": 0,
            "stub_cleanup_merged_same_name_entities": 0,
            "stub_cleanup_merged_duplicate_relations": 1,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-28T13:31:57.736035Z",
          "ts_end": "2026-03-28T13:31:57.904607Z",
          "duration_sec": 0.169,
          "stage": "type_consolidation",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Ontology & Taxonomy Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
              "kind": "kg_store_closure"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02b_type_candidates.json",
              "kind": "type_candidates"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02c_type_consolidation.json",
              "kind": "type_consolidation"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_store_consolidated.json",
              "kind": "kg_store_consolidated"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_consolidated.json",
              "kind": "kg_summary_consolidated"
            }
          ],
          "metrics": {
            "candidates": 80,
            "apply_type_count": 8,
            "apply_subtype_count": 24,
            "review_type_count": 11,
            "review_subtype_count": 28,
            "other_before": 9,
            "other_after": 1,
            "ontology_loaded": true,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-28T13:31:57.942860Z",
          "ts_end": "2026-03-28T13:31:58.045241Z",
          "duration_sec": 0.102,
          "stage": "kg_lite",
          "status": "ok",
          "run_id": "20260328T125822484685Z",
          "agent": "Knowledge Graph Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_consolidated.json",
              "kind": "kg_summary_consolidated"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02d_kg_store_consolidated.json",
              "kind": "kg_store_consolidated"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite.json",
              "kind": "kg_lite"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite_store.json",
              "kind": "kg_lite_store"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_current_chain_30_20260328_v1/02i_kg_lite_decisions.json",
              "kind": "kg_lite_decisions"
            }
          ],
          "metrics": {
            "input_entities": 112,
            "input_relations": 155,
            "kept_entities": 111,
            "kept_relations": 154,
            "dropped_entities": 1,
            "dropped_relations": 1,
            "resumed": false
          }
        }
      ],
      "stage_metrics": {
        "chunks": {
          "status": "ok",
          "duration_sec": 0.832,
          "metrics": {
            "chunks": 30,
            "max_chars": 1800,
            "limit_chunks": 30,
            "resumed": false
          }
        },
        "ontology": {
          "status": "ok",
          "duration_sec": 0.127,
          "metrics": {
            "samples": 30,
            "candidate_entity_types": 7,
            "candidate_relation_types": 8,
            "taxonomy_entity_types": 13,
            "taxonomy_relations": 8,
            "resumed": false
          }
        },
        "kg": {
          "status": "ok",
          "duration_sec": 2009.047,
          "metrics": {
            "entities": 114,
            "relations": 156,
            "observations": 664,
            "ambiguous_entity_forks": 9,
            "chunks": 30,
            "ontology_loaded": true,
            "high_density_chunks": 12,
            "supplement_chunks": 10,
            "max_entity_limit": 14,
            "max_relation_limit": 14,
            "kg_window_size": 1,
            "kg_window_concurrency": 1,
            "kg_warmup_chunks": 30,
            "kg_window_batches": 0,
            "kg_parallel_chunks": 0,
            "resumed": false
          }
        },
        "closure_fix": {
          "status": "ok",
          "duration_sec": 0.336,
          "metrics": {
            "entities": 112,
            "relations": 155,
            "closure_decision_count": 2,
            "closure_drop_count": 0,
            "closure_merge_count": 2,
            "stub_cleanup_dropped_entities": 0,
            "stub_cleanup_dropped_relations": 0,
            "stub_cleanup_merged_duplicate_entities": 0,
            "stub_cleanup_merged_same_name_entities": 0,
            "stub_cleanup_merged_duplicate_relations": 1,
            "resumed": false
          }
        },
        "type_consolidation": {
          "status": "ok",
          "duration_sec": 0.169,
          "metrics": {
            "candidates": 80,
            "apply_type_count": 8,
            "apply_subtype_count": 24,
            "review_type_count": 11,
            "review_subtype_count": 28,
            "other_before": 9,
            "other_after": 1,
            "ontology_loaded": true,
            "resumed": false
          }
        },
        "kg_lite": {
          "status": "ok",
          "duration_sec": 0.102,
          "metrics": {
            "input_entities": 112,
            "input_relations": 155,
            "kept_entities": 111,
            "kept_relations": 154,
            "dropped_entities": 1,
            "dropped_relations": 1,
            "resumed": false
          }
        }
      },
      "quality_metrics": {
        "chunks": {
          "chunk_count": 30,
          "avg_chunk_chars": 1737.133,
          "max_chunk_chars": 1800,
          "avg_fill_ratio": 0.965074,
          "oversize_chunks": 0
        },
        "ontology": {
          "sample_count": 30,
          "sample_coverage_ratio": 1.0,
          "candidate_entity_types": 7,
          "candidate_relation_types": 8,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 8
        },
        "kg": {
          "entity_count": 114,
          "relation_count": 156,
          "observation_count": 664,
          "entity_per_chunk": 3.8,
          "relation_per_chunk": 5.2,
          "observation_per_chunk": 22.133333,
          "ambiguous_entity_forks": 9,
          "supplement_ratio": 0.833333,
          "ontology_loaded": true
        },
        "type_consolidation": {
          "candidate_count": 80,
          "auto_apply_total": 32,
          "review_total": 39,
          "other_before": 9,
          "other_after": 1,
          "other_reduction": 8,
          "other_reduction_ratio": 0.888889,
          "ontology_loaded": true
        }
      }
    },
    "baseline": {
      "summary": {
        "run_dir": "daozu_phase1_baseline_20260322_residualfix",
        "run_id": "20260322T045649833344Z",
        "created_at": "2026-03-22T04:56:49.857015Z",
        "out_dir": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix",
        "input_path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
        "input_sha256": "5c05796b90b9a1956f3fe767cd8288965db478acac5dbed44f64419f0fea185d",
        "provider": "deepseek",
        "video_provider": "doubao",
        "enable_video": false,
        "style_preset": "cinematic, detailed, consistent character design, coherent lighting",
        "limits": {
          "max_chars": 1800,
          "limit_chunks": 30,
          "limit_scenes": null,
          "limit_shots": null
        },
        "status": "ok",
        "errors": 0,
        "counts": {
          "chunks": 30,
          "ontology_samples": 30,
          "ontology_candidate_entity_types": 7,
          "ontology_candidate_relation_types": 8,
          "ontology_entity_taxonomy": 13,
          "ontology_relation_taxonomy": 8,
          "observations": 637,
          "entities": 123,
          "relations": 168,
          "type_candidates": 93,
          "type_apply_type_count": 6,
          "type_apply_subtype_count": 28,
          "type_other_before": 6,
          "type_other_after": 0,
          "entity_registry_entities": 0,
          "entity_visual_cards": 0,
          "entity_voice_cards": 0,
          "entity_asset_bindings": 0,
          "scenes": 0,
          "chronology_scenes": 0,
          "chronology_groups": 0,
          "chronology_edges": 0,
          "chronology_conflicts": 0,
          "adaptation_scenes": 0,
          "adaptation_groups": 0,
          "adaptation_beats": 0,
          "adaptation_retain_scenes": 0,
          "adaptation_compress_scenes": 0,
          "adaptation_bridge_scenes": 0,
          "adaptation_drop_scenes": 0,
          "scripts": 0,
          "shots": 0,
          "style_fixed_positive_terms": 0,
          "style_fixed_negative_terms": 0,
          "style_provider_profiles": 0,
          "style_manual_override_slots": 0,
          "style_reference_ready_entities": 0,
          "storyboards": 0,
          "prompt_guard_shots": 0,
          "prompt_guard_pass_shots": 0,
          "prompt_guard_warning_shots": 0,
          "prompt_guard_fail_shots": 0,
          "prompt_guard_issue_count": 0,
          "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",
          "scripts": "04_scripts.json",
          "style_bible": "04b_style_bible.json",
          "storyboard": "05_storyboard.json",
          "prompt_guard": "05b_storyboard_guard.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"
        },
        "updated_at": "2026-03-28T13:34:40.985566Z",
        "run_uid": "20260322T045649833344Z",
        "run_key": "20260322T045649833344Z",
        "trace_scope": "live",
        "is_current_live": true,
        "archive_rel": "",
        "web_paths": {
          "run_root": "",
          "logs_dir": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/",
          "llm_dir": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/llm/",
          "manifest": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/run_manifest.json",
          "project": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/project.json",
          "report_html": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/run_report.html",
          "report_md": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/run_report.md",
          "metrics": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/run_metrics.json",
          "events": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/run_events.jsonl",
          "errors": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/run_errors.jsonl",
          "stage_timings": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/stage_timings.jsonl",
          "llm_calls": "/novel2video/runs/daozu_phase1_baseline_20260322_residualfix/logs/llm_calls.jsonl"
        }
      },
      "counts": {
        "chunks": 30,
        "ontology_samples": 30,
        "ontology_candidate_entity_types": 7,
        "ontology_candidate_relation_types": 8,
        "ontology_entity_taxonomy": 13,
        "ontology_relation_taxonomy": 8,
        "observations": 637,
        "entities": 123,
        "relations": 168,
        "type_candidates": 93,
        "type_apply_type_count": 6,
        "type_apply_subtype_count": 28,
        "type_other_before": 6,
        "type_other_after": 0,
        "entity_registry_entities": 0,
        "entity_visual_cards": 0,
        "entity_voice_cards": 0,
        "entity_asset_bindings": 0,
        "scenes": 0,
        "chronology_scenes": 0,
        "chronology_groups": 0,
        "chronology_edges": 0,
        "chronology_conflicts": 0,
        "adaptation_scenes": 0,
        "adaptation_groups": 0,
        "adaptation_beats": 0,
        "adaptation_retain_scenes": 0,
        "adaptation_compress_scenes": 0,
        "adaptation_bridge_scenes": 0,
        "adaptation_drop_scenes": 0,
        "scripts": 0,
        "shots": 0,
        "style_fixed_positive_terms": 0,
        "style_fixed_negative_terms": 0,
        "style_provider_profiles": 0,
        "style_manual_override_slots": 0,
        "style_reference_ready_entities": 0,
        "storyboards": 0,
        "prompt_guard_shots": 0,
        "prompt_guard_pass_shots": 0,
        "prompt_guard_warning_shots": 0,
        "prompt_guard_fail_shots": 0,
        "prompt_guard_issue_count": 0,
        "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,
        "llm_calls": 38,
        "run_errors": 0
      },
      "stage_rows": [
        {
          "ts_start": "2026-03-22T04:56:50.172247Z",
          "ts_end": "2026-03-22T04:56:51.062037Z",
          "duration_sec": 0.89,
          "stage": "chunks",
          "status": "ok",
          "run_id": "20260322T045649833344Z",
          "agent": "Ingestion & Chunking Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
              "kind": "novel_text"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01_chunks.json",
              "kind": "chunks"
            }
          ],
          "metrics": {
            "chunks": 30,
            "max_chars": 1800,
            "limit_chunks": 30,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-22T04:56:51.079523Z",
          "ts_end": "2026-03-22T04:56:51.192997Z",
          "duration_sec": 0.113,
          "stage": "ontology",
          "status": "ok",
          "run_id": "20260322T045649833344Z",
          "agent": "Ontology & Taxonomy Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01_chunks.json",
              "kind": "chunks"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01b_ontology_samples.json",
              "kind": "ontology_samples"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01c_ontology_candidates.json",
              "kind": "ontology_candidates"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "metrics": {
            "samples": 30,
            "candidate_entity_types": 7,
            "candidate_relation_types": 8,
            "taxonomy_entity_types": 13,
            "taxonomy_relations": 8,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-22T04:56:51.212320Z",
          "ts_end": "2026-03-22T05:26:27.795451Z",
          "duration_sec": 1776.583,
          "stage": "kg",
          "status": "ok",
          "run_id": "20260322T045649833344Z",
          "agent": "Knowledge Graph Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01_chunks.json",
              "kind": "chunks"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02_kg.json",
              "kind": "kg_summary"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02_kg_store.json",
              "kind": "kg_store"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02_kg_observations.jsonl",
              "kind": "kg_observations"
            }
          ],
          "metrics": {
            "entities": 123,
            "relations": 168,
            "observations": 637,
            "ambiguous_entity_forks": 20,
            "chunks": 30,
            "ontology_loaded": true,
            "high_density_chunks": 12,
            "supplement_chunks": 8,
            "max_entity_limit": 14,
            "max_relation_limit": 14,
            "kg_observation_rows": 637,
            "kg_observation_rows_dropped": 0,
            "kg_entity_redirect_applied": 0,
            "kg_relation_redirect_applied": 0,
            "stub_cleanup_dropped_entities": 0,
            "stub_cleanup_dropped_relations": 0,
            "stub_cleanup_merged_duplicate_entities": 0,
            "stub_cleanup_merged_same_name_entities": 0,
            "stub_cleanup_merged_duplicate_relations": 0,
            "resumed": false
          }
        },
        {
          "ts_start": "2026-03-22T05:26:27.826875Z",
          "ts_end": "2026-03-22T05:26:27.987879Z",
          "duration_sec": 0.161,
          "stage": "type_consolidation",
          "status": "ok",
          "run_id": "20260322T045649833344Z",
          "agent": "Ontology & Taxonomy Agent",
          "inputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02_kg_store.json",
              "kind": "kg_store"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/01d_ontology.json",
              "kind": "ontology_doc"
            }
          ],
          "outputs": [
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02b_type_candidates.json",
              "kind": "type_candidates"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02c_type_consolidation.json",
              "kind": "type_consolidation"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02d_kg_store_consolidated.json",
              "kind": "kg_store_consolidated"
            },
            {
              "path": "/wwwb/aitools/writer/outputs/daozu_kg_large_20260322_residualfix/02d_kg_consolidated.json",
              "kind": "kg_summary_consolidated"
            }
          ],
          "metrics": {
            "candidates": 93,
            "apply_type_count": 6,
            "apply_subtype_count": 28,
            "review_type_count": 13,
            "review_subtype_count": 34,
            "other_before": 6,
            "other_after": 0,
            "ontology_loaded": true,
            "resumed": false
          }
        }
      ],
      "stage_metrics": {
        "chunks": {
          "status": "ok",
          "duration_sec": 0.89,
          "metrics": {
            "chunks": 30,
            "max_chars": 1800,
            "limit_chunks": 30,
            "resumed": false
          }
        },
        "ontology": {
          "status": "ok",
          "duration_sec": 0.113,
          "metrics": {
            "samples": 30,
            "candidate_entity_types": 7,
            "candidate_relation_types": 8,
            "taxonomy_entity_types": 13,
            "taxonomy_relations": 8,
            "resumed": false
          }
        },
        "kg": {
          "status": "ok",
          "duration_sec": 1776.583,
          "metrics": {
            "entities": 123,
            "relations": 168,
            "observations": 637,
            "ambiguous_entity_forks": 20,
            "chunks": 30,
            "ontology_loaded": true,
            "high_density_chunks": 12,
            "supplement_chunks": 8,
            "max_entity_limit": 14,
            "max_relation_limit": 14,
            "kg_observation_rows": 637,
            "kg_observation_rows_dropped": 0,
            "kg_entity_redirect_applied": 0,
            "kg_relation_redirect_applied": 0,
            "stub_cleanup_dropped_entities": 0,
            "stub_cleanup_dropped_relations": 0,
            "stub_cleanup_merged_duplicate_entities": 0,
            "stub_cleanup_merged_same_name_entities": 0,
            "stub_cleanup_merged_duplicate_relations": 0,
            "resumed": false
          }
        },
        "type_consolidation": {
          "status": "ok",
          "duration_sec": 0.161,
          "metrics": {
            "candidates": 93,
            "apply_type_count": 6,
            "apply_subtype_count": 28,
            "review_type_count": 13,
            "review_subtype_count": 34,
            "other_before": 6,
            "other_after": 0,
            "ontology_loaded": true,
            "resumed": false
          }
        }
      },
      "quality_metrics": {
        "chunks": {
          "chunk_count": 30,
          "avg_chunk_chars": 1737.133,
          "max_chunk_chars": 1800,
          "avg_fill_ratio": 0.965074,
          "oversize_chunks": 0
        },
        "ontology": {
          "sample_count": 30,
          "sample_coverage_ratio": 1.0,
          "candidate_entity_types": 7,
          "candidate_relation_types": 8,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 8
        },
        "kg": {
          "entity_count": 123,
          "relation_count": 168,
          "observation_count": 637,
          "entity_per_chunk": 4.1,
          "relation_per_chunk": 5.6,
          "observation_per_chunk": 21.233333,
          "ambiguous_entity_forks": 20,
          "supplement_ratio": 0.666667,
          "ontology_loaded": true
        },
        "type_consolidation": {
          "candidate_count": 93,
          "auto_apply_total": 34,
          "review_total": 47,
          "other_before": 6,
          "other_after": 0,
          "other_reduction": 6,
          "other_reduction_ratio": 1.0,
          "ontology_loaded": true
        }
      }
    },
    "candidate_validation": {
      "artifact_paths": {
        "chunks": "outputs/daozu_kg_current_chain_30_20260328_v1/01_chunks.json",
        "ontology_samples": "outputs/daozu_kg_current_chain_30_20260328_v1/01b_ontology_samples.json",
        "ontology_candidates": "outputs/daozu_kg_current_chain_30_20260328_v1/01c_ontology_candidates.json",
        "ontology_doc": "outputs/daozu_kg_current_chain_30_20260328_v1/01d_ontology.json",
        "kg_store": "outputs/daozu_kg_current_chain_30_20260328_v1/02_kg_store.json",
        "kg_summary": "outputs/daozu_kg_current_chain_30_20260328_v1/02_kg.json",
        "kg_store_closure": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_store_closure.json",
        "kg_summary_closure": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure.json",
        "kg_closure_decisions": "outputs/daozu_kg_current_chain_30_20260328_v1/02a_kg_closure_decisions.json",
        "type_candidates": "outputs/daozu_kg_current_chain_30_20260328_v1/02b_type_candidates.json",
        "type_consolidation": "outputs/daozu_kg_current_chain_30_20260328_v1/02c_type_consolidation.json"
      },
      "missing": [],
      "errors": {
        "chunks": [],
        "ontology_samples": [],
        "ontology_candidates": [],
        "ontology_doc": [],
        "kg_store": [],
        "kg_summary": [],
        "kg_store_closure": [],
        "kg_summary_closure": [],
        "kg_closure_decisions": [],
        "type_candidates": [],
        "type_consolidation": []
      },
      "is_valid": true
    },
    "baseline_validation": {
      "artifact_paths": {
        "chunks": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/01_chunks.json",
        "ontology_samples": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/01b_ontology_samples.json",
        "ontology_candidates": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/01c_ontology_candidates.json",
        "ontology_doc": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/01d_ontology.json",
        "kg_store": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02_kg_store.json",
        "kg_summary": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02_kg.json",
        "kg_store_closure": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02a_kg_store_closure.json",
        "kg_summary_closure": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02a_kg_closure.json",
        "kg_closure_decisions": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02a_kg_closure_decisions.json",
        "type_candidates": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02b_type_candidates.json",
        "type_consolidation": "baselines/phase1/runs/daozu_phase1_baseline_20260322_residualfix/02c_type_consolidation.json"
      },
      "missing": [
        "kg_store_closure",
        "kg_summary_closure",
        "kg_closure_decisions"
      ],
      "errors": {
        "chunks": [],
        "ontology_samples": [],
        "ontology_candidates": [],
        "ontology_doc": [],
        "kg_store": [],
        "kg_summary": [],
        "type_candidates": [],
        "type_consolidation": []
      },
      "is_valid": false
    },
    "diff": {
      "chunks": {
        "baseline": 30,
        "candidate": 30,
        "delta": 0,
        "pct": 0.0
      },
      "ontology_samples": {
        "baseline": 30,
        "candidate": 30,
        "delta": 0,
        "pct": 0.0
      },
      "ontology_candidate_entity_types": {
        "baseline": 7,
        "candidate": 7,
        "delta": 0,
        "pct": 0.0
      },
      "ontology_candidate_relation_types": {
        "baseline": 8,
        "candidate": 8,
        "delta": 0,
        "pct": 0.0
      },
      "ontology_entity_taxonomy": {
        "baseline": 13,
        "candidate": 13,
        "delta": 0,
        "pct": 0.0
      },
      "ontology_relation_taxonomy": {
        "baseline": 8,
        "candidate": 8,
        "delta": 0,
        "pct": 0.0
      },
      "entities": {
        "baseline": 123,
        "candidate": 114,
        "delta": -9,
        "pct": -7.317
      },
      "relations": {
        "baseline": 168,
        "candidate": 156,
        "delta": -12,
        "pct": -7.143
      },
      "observations": {
        "baseline": 637,
        "candidate": 664,
        "delta": 27,
        "pct": 4.239
      },
      "type_candidates": {
        "baseline": 93,
        "candidate": 80,
        "delta": -13,
        "pct": -13.978
      },
      "type_apply_type_count": {
        "baseline": 6,
        "candidate": 8,
        "delta": 2,
        "pct": 33.333
      },
      "type_apply_subtype_count": {
        "baseline": 28,
        "candidate": 24,
        "delta": -4,
        "pct": -14.286
      },
      "type_other_before": {
        "baseline": 6,
        "candidate": 9,
        "delta": 3,
        "pct": 50.0
      },
      "type_other_after": {
        "baseline": 0,
        "candidate": 1,
        "delta": 1,
        "pct": null
      },
      "llm_calls": {
        "baseline": 38,
        "candidate": 40,
        "delta": 2,
        "pct": 5.263
      },
      "run_errors": {
        "baseline": 0,
        "candidate": 0,
        "delta": 0,
        "pct": null
      }
    },
    "quality_overview": [
      {
        "stage": "chunks",
        "title": "Chunks",
        "baseline_status": "ok",
        "candidate_status": "ok",
        "baseline_duration_sec": 0.89,
        "candidate_duration_sec": 0.832,
        "metrics": [
          {
            "key": "chunk_count",
            "label": "Chunk 数",
            "kind": "int",
            "baseline": 30,
            "candidate": 30,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "avg_chunk_chars",
            "label": "平均 Chunk 字数",
            "kind": "float1",
            "baseline": 1737.133,
            "candidate": 1737.133,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "max_chunk_chars",
            "label": "最大 Chunk 字数",
            "kind": "int",
            "baseline": 1800,
            "candidate": 1800,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "avg_fill_ratio",
            "label": "平均填充率",
            "kind": "pct1",
            "baseline": 0.965074,
            "candidate": 0.965074,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "oversize_chunks",
            "label": "超长 Chunk 数",
            "kind": "int",
            "baseline": 0,
            "candidate": 0,
            "delta": 0.0,
            "pct": null
          }
        ]
      },
      {
        "stage": "ontology",
        "title": "Ontology",
        "baseline_status": "ok",
        "candidate_status": "ok",
        "baseline_duration_sec": 0.113,
        "candidate_duration_sec": 0.127,
        "metrics": [
          {
            "key": "sample_count",
            "label": "抽样数",
            "kind": "int",
            "baseline": 30,
            "candidate": 30,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "sample_coverage_ratio",
            "label": "抽样覆盖率",
            "kind": "pct1",
            "baseline": 1.0,
            "candidate": 1.0,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "candidate_entity_types",
            "label": "候选实体类型数",
            "kind": "int",
            "baseline": 7,
            "candidate": 7,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "candidate_relation_types",
            "label": "候选关系类型数",
            "kind": "int",
            "baseline": 8,
            "candidate": 8,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "taxonomy_entity_types",
            "label": "实体 Taxonomy 大小",
            "kind": "int",
            "baseline": 13,
            "candidate": 13,
            "delta": 0.0,
            "pct": 0.0
          },
          {
            "key": "taxonomy_relations",
            "label": "关系 Taxonomy 大小",
            "kind": "int",
            "baseline": 8,
            "candidate": 8,
            "delta": 0.0,
            "pct": 0.0
          }
        ]
      },
      {
        "stage": "kg",
        "title": "KG",
        "baseline_status": "ok",
        "candidate_status": "ok",
        "baseline_duration_sec": 1776.583,
        "candidate_duration_sec": 2009.047,
        "metrics": [
          {
            "key": "entity_count",
            "label": "实体数",
            "kind": "int",
            "baseline": 123,
            "candidate": 114,
            "delta": -9.0,
            "pct": -7.317
          },
          {
            "key": "relation_count",
            "label": "关系数",
            "kind": "int",
            "baseline": 168,
            "candidate": 156,
            "delta": -12.0,
            "pct": -7.143
          },
          {
            "key": "observation_count",
            "label": "Observation 数",
            "kind": "int",
            "baseline": 637,
            "candidate": 664,
            "delta": 27.0,
            "pct": 4.239
          },
          {
            "key": "entity_per_chunk",
            "label": "每 Chunk 实体数",
            "kind": "float2",
            "baseline": 4.1,
            "candidate": 3.8,
            "delta": -0.3,
            "pct": -7.317
          },
          {
            "key": "relation_per_chunk",
            "label": "每 Chunk 关系数",
            "kind": "float2",
            "baseline": 5.6,
            "candidate": 5.2,
            "delta": -0.4,
            "pct": -7.143
          },
          {
            "key": "observation_per_chunk",
            "label": "每 Chunk Observation 数",
            "kind": "float2",
            "baseline": 21.233333,
            "candidate": 22.133333,
            "delta": 0.9,
            "pct": 4.239
          },
          {
            "key": "ambiguous_entity_forks",
            "label": "歧义分叉数",
            "kind": "int",
            "baseline": 20,
            "candidate": 9,
            "delta": -11.0,
            "pct": -55.0
          },
          {
            "key": "supplement_ratio",
            "label": "补抽占比",
            "kind": "pct1",
            "baseline": 0.666667,
            "candidate": 0.833333,
            "delta": 0.166666,
            "pct": 25.0
          },
          {
            "key": "ontology_loaded",
            "label": "已加载 Ontology",
            "kind": "bool",
            "baseline": true,
            "candidate": true,
            "delta": null,
            "pct": null,
            "changed": false
          }
        ]
      },
      {
        "stage": "type_consolidation",
        "title": "Type Consolidation",
        "baseline_status": "ok",
        "candidate_status": "ok",
        "baseline_duration_sec": 0.161,
        "candidate_duration_sec": 0.169,
        "metrics": [
          {
            "key": "candidate_count",
            "label": "候选实体数",
            "kind": "int",
            "baseline": 93,
            "candidate": 80,
            "delta": -13.0,
            "pct": -13.978
          },
          {
            "key": "auto_apply_total",
            "label": "自动应用总数",
            "kind": "int",
            "baseline": 34,
            "candidate": 32,
            "delta": -2.0,
            "pct": -5.882
          },
          {
            "key": "review_total",
            "label": "待复核总数",
            "kind": "int",
            "baseline": 47,
            "candidate": 39,
            "delta": -8.0,
            "pct": -17.021
          },
          {
            "key": "other_before",
            "label": "收敛前 Other",
            "kind": "int",
            "baseline": 6,
            "candidate": 9,
            "delta": 3.0,
            "pct": 50.0
          },
          {
            "key": "other_after",
            "label": "收敛后 Other",
            "kind": "int",
            "baseline": 0,
            "candidate": 1,
            "delta": 1.0,
            "pct": null
          },
          {
            "key": "other_reduction",
            "label": "Other 减少数",
            "kind": "int",
            "baseline": 6,
            "candidate": 8,
            "delta": 2.0,
            "pct": 33.333
          },
          {
            "key": "other_reduction_ratio",
            "label": "Other 压缩率",
            "kind": "pct1",
            "baseline": 1.0,
            "candidate": 0.888889,
            "delta": -0.111111,
            "pct": -11.111
          },
          {
            "key": "ontology_loaded",
            "label": "已加载 Ontology",
            "kind": "bool",
            "baseline": true,
            "candidate": true,
            "delta": null,
            "pct": null,
            "changed": false
          }
        ]
      }
    ],
    "golden_manifest": {},
    "status": "needs-review"
  },
  "kg_lite_summary": {
    "source_entity_count": 112,
    "source_relation_count": 155,
    "kept_entity_count": 111,
    "kept_relation_count": 154,
    "summary_entity_count": 111,
    "summary_relation_count": 154,
    "store_entity_count": 111,
    "store_relation_count": 154,
    "decision_entity_count": 112,
    "decision_relation_count": 155,
    "dropped_entity_count": 1,
    "dropped_relation_count": 1,
    "source_kg_path": "02d_kg_consolidated.json",
    "source_kg_store_path": "02d_kg_store_consolidated.json",
    "strategy": "program_first_prune"
  },
  "status": "pass"
}