{
  "version": "kg_quality_gate.v1",
  "generated_at": "2026-03-28T12:51:04.185443Z",
  "profile": "current_chain",
  "candidate_run_dir": "outputs/kg_layer_smoke_20260328_v1",
  "baseline_run_dir": "",
  "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": 6,
        "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": "kg_layer_smoke_20260328_v1",
      "run_id": "20260328T065601657593Z",
      "created_at": "2026-03-28T06:56:01.680395Z",
      "out_dir": "outputs/kg_layer_smoke_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": 6,
        "limit_scenes": 12,
        "limit_shots": null
      },
      "status": "ok",
      "errors": 0,
      "counts": {
        "chunks": 6,
        "ontology_samples": 6,
        "ontology_candidate_entity_types": 3,
        "ontology_candidate_relation_types": 6,
        "ontology_entity_taxonomy": 13,
        "ontology_relation_taxonomy": 6,
        "observations": 166,
        "entities": 43,
        "relations": 50,
        "type_candidates": 33,
        "type_apply_type_count": 5,
        "type_apply_subtype_count": 13,
        "type_other_before": 7,
        "type_other_after": 2,
        "entity_registry_entities": 41,
        "entity_visual_cards": 41,
        "entity_voice_cards": 13,
        "entity_asset_bindings": 41,
        "scenes": 12,
        "chronology_scenes": 12,
        "chronology_groups": 12,
        "chronology_edges": 12,
        "chronology_conflicts": 0,
        "adaptation_scenes": 12,
        "adaptation_groups": 0,
        "adaptation_beats": 0,
        "adaptation_retain_scenes": 11,
        "adaptation_compress_scenes": 1,
        "adaptation_bridge_scenes": 0,
        "adaptation_drop_scenes": 0,
        "scripts": 12,
        "shots": 36,
        "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-28T12:51:04.180551Z",
      "run_uid": "20260328T065601657593Z",
      "run_key": "20260328T065601657593Z",
      "trace_scope": "live",
      "is_current_live": true,
      "archive_rel": "",
      "web_paths": {
        "run_root": "",
        "logs_dir": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/",
        "llm_dir": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/llm/",
        "manifest": "/novel2video/runs/kg_layer_smoke_20260328_v1/run_manifest.json",
        "project": "/novel2video/runs/kg_layer_smoke_20260328_v1/project.json",
        "report_html": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/run_report.html",
        "report_md": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/run_report.md",
        "metrics": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/run_metrics.json",
        "events": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/run_events.jsonl",
        "errors": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/run_errors.jsonl",
        "stage_timings": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/stage_timings.jsonl",
        "llm_calls": "/novel2video/runs/kg_layer_smoke_20260328_v1/logs/llm_calls.jsonl"
      }
    },
    "counts": {
      "chunks": 6,
      "ontology_samples": 6,
      "ontology_candidate_entity_types": 3,
      "ontology_candidate_relation_types": 6,
      "ontology_entity_taxonomy": 13,
      "ontology_relation_taxonomy": 6,
      "observations": 166,
      "entities": 43,
      "relations": 50,
      "type_candidates": 33,
      "type_apply_type_count": 5,
      "type_apply_subtype_count": 13,
      "type_other_before": 7,
      "type_other_after": 2,
      "entity_registry_entities": 41,
      "entity_visual_cards": 41,
      "entity_voice_cards": 13,
      "entity_asset_bindings": 41,
      "scenes": 12,
      "chronology_scenes": 12,
      "chronology_groups": 12,
      "chronology_edges": 12,
      "chronology_conflicts": 0,
      "adaptation_scenes": 12,
      "adaptation_groups": 0,
      "adaptation_beats": 0,
      "adaptation_retain_scenes": 11,
      "adaptation_compress_scenes": 1,
      "adaptation_bridge_scenes": 0,
      "adaptation_drop_scenes": 0,
      "scripts": 12,
      "shots": 36,
      "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": 39,
      "run_errors": 0
    },
    "stage_rows": [
      {
        "ts_start": "2026-03-28T06:56:06.525147Z",
        "ts_end": "2026-03-28T06:56:07.371508Z",
        "duration_sec": 0.846,
        "stage": "chunks",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Ingestion & Chunking Agent",
        "inputs": [
          {
            "path": "/wwwb/aitools/writer/input/道祖是克苏鲁.txt",
            "kind": "novel_text"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01_chunks.json",
            "kind": "chunks"
          }
        ],
        "metrics": {
          "chunks": 6,
          "max_chars": 1800,
          "limit_chunks": 6,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T06:56:07.388700Z",
        "ts_end": "2026-03-28T06:56:07.457951Z",
        "duration_sec": 0.069,
        "stage": "ontology",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Ontology & Taxonomy Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01_chunks.json",
            "kind": "chunks"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01b_ontology_samples.json",
            "kind": "ontology_samples"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01c_ontology_candidates.json",
            "kind": "ontology_candidates"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "metrics": {
          "samples": 6,
          "candidate_entity_types": 3,
          "candidate_relation_types": 6,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 6,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T06:56:07.476203Z",
        "ts_end": "2026-03-28T07:04:57.821200Z",
        "duration_sec": 530.345,
        "stage": "kg",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Knowledge Graph Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01_chunks.json",
            "kind": "chunks"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02_kg.json",
            "kind": "kg_summary"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02_kg_store.json",
            "kind": "kg_store"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02_kg_observations.jsonl",
            "kind": "kg_observations"
          }
        ],
        "metrics": {
          "entities": 43,
          "relations": 50,
          "observations": 166,
          "ambiguous_entity_forks": 1,
          "chunks": 6,
          "ontology_loaded": true,
          "high_density_chunks": 3,
          "supplement_chunks": 3,
          "max_entity_limit": 14,
          "max_relation_limit": 14,
          "kg_window_size": 1,
          "kg_window_concurrency": 1,
          "kg_warmup_chunks": 6,
          "kg_window_batches": 0,
          "kg_parallel_chunks": 0,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:04:57.842645Z",
        "ts_end": "2026-03-28T07:04:57.971667Z",
        "duration_sec": 0.129,
        "stage": "closure_fix",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Contextual Closure & Cleanup Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02_kg_store.json",
            "kind": "kg_store"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02_kg_observations.jsonl",
            "kind": "kg_observations"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02a_kg_closure.json",
            "kind": "kg_summary_closure"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02a_kg_store_closure.json",
            "kind": "kg_store_closure"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02a_kg_closure_decisions.json",
            "kind": "kg_closure_decisions"
          }
        ],
        "metrics": {
          "entities": 41,
          "relations": 49,
          "closure_decision_count": 2,
          "closure_drop_count": 1,
          "closure_merge_count": 1,
          "stub_cleanup_dropped_entities": 1,
          "stub_cleanup_dropped_relations": 1,
          "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-28T07:04:57.993047Z",
        "ts_end": "2026-03-28T07:04:58.063996Z",
        "duration_sec": 0.071,
        "stage": "type_consolidation",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Ontology & Taxonomy Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02a_kg_store_closure.json",
            "kind": "kg_store_closure"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01d_ontology.json",
            "kind": "ontology_doc"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02b_type_candidates.json",
            "kind": "type_candidates"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02c_type_consolidation.json",
            "kind": "type_consolidation"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          }
        ],
        "metrics": {
          "candidates": 33,
          "apply_type_count": 5,
          "apply_subtype_count": 13,
          "review_type_count": 3,
          "review_subtype_count": 9,
          "other_before": 7,
          "other_after": 2,
          "ontology_loaded": true,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:04:58.087756Z",
        "ts_end": "2026-03-28T07:04:58.123897Z",
        "duration_sec": 0.036,
        "stage": "kg_lite",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Knowledge Graph Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite.json",
            "kind": "kg_lite"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite_store.json",
            "kind": "kg_lite_store"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite_decisions.json",
            "kind": "kg_lite_decisions"
          }
        ],
        "metrics": {
          "input_entities": 41,
          "input_relations": 49,
          "kept_entities": 40,
          "kept_relations": 49,
          "dropped_entities": 1,
          "dropped_relations": 0,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:04:58.146347Z",
        "ts_end": "2026-03-28T07:04:58.174046Z",
        "duration_sec": 0.028,
        "stage": "entity_registry",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Entity Registry & Asset Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02e_entity_registry.json",
            "kind": "entity_registry"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02f_entity_visual_cards.json",
            "kind": "entity_visual_cards"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02g_entity_voice_cards.json",
            "kind": "entity_voice_cards"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02h_entity_assets.json",
            "kind": "entity_assets"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/entity_registry/20260328T065601657593Z__02e_entity_registry.json",
            "kind": "entity_registry_snapshot"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/entity_registry/20260328T065601657593Z__02f_entity_visual_cards.json",
            "kind": "entity_visual_cards_snapshot"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/entity_registry/20260328T065601657593Z__02g_entity_voice_cards.json",
            "kind": "entity_voice_cards_snapshot"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/entity_registry/20260328T065601657593Z__02h_entity_assets.json",
            "kind": "entity_assets_snapshot"
          }
        ],
        "metrics": {
          "entity_registry_entities": 41,
          "entity_visual_cards": 41,
          "entity_voice_cards": 13,
          "entity_asset_bindings": 41,
          "locked_count": 0,
          "needs_review_count": 5,
          "parallel_with_scenes": true,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:04:58.151478Z",
        "ts_end": "2026-03-28T07:07:16.818476Z",
        "duration_sec": 138.667,
        "stage": "scenes",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Scene Segmentation Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/01_chunks.json",
            "kind": "chunks"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite_store.json",
            "kind": "kg_lite_store"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03_scenes.json",
            "kind": "scenes"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/scenes/20260328T065601657593Z__03_scenes.json",
            "kind": "scenes_snapshot"
          }
        ],
        "metrics": {
          "scenes": 12,
          "chunks": 6,
          "continued_scenes": 0,
          "scene_with_characters": 11,
          "scene_with_locations": 3,
          "kg_context_loaded": true,
          "kg_context_layer": "kg_lite",
          "scenes_concurrency": 1,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:07:16.836473Z",
        "ts_end": "2026-03-28T07:07:16.842366Z",
        "duration_sec": 0.006,
        "stage": "chronology",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Chronology & Narrative Time Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03_scenes.json",
            "kind": "scenes"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite_store.json",
            "kind": "kg_lite_store"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03b_chronology.json",
            "kind": "chronology"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/chronology/20260328T065601657593Z__03b_chronology.json",
            "kind": "chronology_snapshot"
          }
        ],
        "metrics": {
          "scenes": 12,
          "chronology_groups": 12,
          "chronology_edges": 12,
          "chronology_conflicts": 0,
          "low_confidence_scenes": 1,
          "explicit_anchors": 2,
          "kg_context_layer": "kg_lite",
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:07:16.859941Z",
        "ts_end": "2026-03-28T07:10:23.905937Z",
        "duration_sec": 187.046,
        "stage": "adaptation",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Adaptation & Story Editor Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03_scenes.json",
            "kind": "scenes"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03b_chronology.json",
            "kind": "chronology"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02i_kg_lite.json",
            "kind": "kg_lite"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03c_adaptation.json",
            "kind": "adaptation"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/adaptation/20260328T065601657593Z__03c_adaptation.json",
            "kind": "adaptation_snapshot"
          }
        ],
        "metrics": {
          "scenes": 12,
          "retain_scenes": 11,
          "compress_scenes": 1,
          "bridge_scenes": 0,
          "kg_context_layer": "kg_lite",
          "adaptation_concurrency": 1,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:10:23.926160Z",
        "ts_end": "2026-03-28T07:10:23.962760Z",
        "duration_sec": 0.037,
        "stage": "kg_deep",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Knowledge Graph Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_consolidated.json",
            "kind": "kg_summary_consolidated"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02d_kg_store_consolidated.json",
            "kind": "kg_store_consolidated"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03_scenes.json",
            "kind": "scenes"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03c_adaptation.json",
            "kind": "adaptation"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02j_kg_deep.json",
            "kind": "kg_deep"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02j_kg_deep_store.json",
            "kind": "kg_deep_store"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02j_kg_deep_decisions.json",
            "kind": "kg_deep_decisions"
          }
        ],
        "metrics": {
          "input_entities": 41,
          "input_relations": 49,
          "kept_entities": 41,
          "kept_relations": 38,
          "scene_count": 12,
          "seed_entities": 5,
          "resumed": false
        }
      },
      {
        "ts_start": "2026-03-28T07:10:23.985917Z",
        "ts_end": "2026-03-28T07:16:09.624344Z",
        "duration_sec": 345.638,
        "stage": "script",
        "status": "ok",
        "run_id": "20260328T065601657593Z",
        "agent": "Script & Shot Agent",
        "inputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03_scenes.json",
            "kind": "scenes"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03b_chronology.json",
            "kind": "chronology"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/03c_adaptation.json",
            "kind": "adaptation"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/02j_kg_deep.json",
            "kind": "kg_deep"
          }
        ],
        "outputs": [
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/04_scripts.json",
            "kind": "scripts"
          },
          {
            "path": "outputs/kg_layer_smoke_20260328_v1/logs/stage_artifacts/script/20260328T065601657593Z__04_scripts.json",
            "kind": "scripts_snapshot"
          }
        ],
        "metrics": {
          "scripts": 12,
          "shots": 36,
          "dialogue_lines": 19,
          "narration_shots": 12,
          "chronology_bound_scripts": 12,
          "chronology_non_mainline_scripts": 1,
          "chronology_reordered_scripts": 2,
          "adaptation_bound_scripts": 12,
          "kg_context_layer": "kg_deep",
          "script_concurrency": 1,
          "resumed": false
        }
      }
    ],
    "stage_metrics": {
      "chunks": {
        "status": "ok",
        "duration_sec": 0.846,
        "metrics": {
          "chunks": 6,
          "max_chars": 1800,
          "limit_chunks": 6,
          "resumed": false
        }
      },
      "ontology": {
        "status": "ok",
        "duration_sec": 0.069,
        "metrics": {
          "samples": 6,
          "candidate_entity_types": 3,
          "candidate_relation_types": 6,
          "taxonomy_entity_types": 13,
          "taxonomy_relations": 6,
          "resumed": false
        }
      },
      "kg": {
        "status": "ok",
        "duration_sec": 530.345,
        "metrics": {
          "entities": 43,
          "relations": 50,
          "observations": 166,
          "ambiguous_entity_forks": 1,
          "chunks": 6,
          "ontology_loaded": true,
          "high_density_chunks": 3,
          "supplement_chunks": 3,
          "max_entity_limit": 14,
          "max_relation_limit": 14,
          "kg_window_size": 1,
          "kg_window_concurrency": 1,
          "kg_warmup_chunks": 6,
          "kg_window_batches": 0,
          "kg_parallel_chunks": 0,
          "resumed": false
        }
      },
      "closure_fix": {
        "status": "ok",
        "duration_sec": 0.129,
        "metrics": {
          "entities": 41,
          "relations": 49,
          "closure_decision_count": 2,
          "closure_drop_count": 1,
          "closure_merge_count": 1,
          "stub_cleanup_dropped_entities": 1,
          "stub_cleanup_dropped_relations": 1,
          "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.071,
        "metrics": {
          "candidates": 33,
          "apply_type_count": 5,
          "apply_subtype_count": 13,
          "review_type_count": 3,
          "review_subtype_count": 9,
          "other_before": 7,
          "other_after": 2,
          "ontology_loaded": true,
          "resumed": false
        }
      },
      "kg_lite": {
        "status": "ok",
        "duration_sec": 0.036,
        "metrics": {
          "input_entities": 41,
          "input_relations": 49,
          "kept_entities": 40,
          "kept_relations": 49,
          "dropped_entities": 1,
          "dropped_relations": 0,
          "resumed": false
        }
      },
      "entity_registry": {
        "status": "ok",
        "duration_sec": 0.028,
        "metrics": {
          "entity_registry_entities": 41,
          "entity_visual_cards": 41,
          "entity_voice_cards": 13,
          "entity_asset_bindings": 41,
          "locked_count": 0,
          "needs_review_count": 5,
          "parallel_with_scenes": true,
          "resumed": false
        }
      },
      "scenes": {
        "status": "ok",
        "duration_sec": 138.667,
        "metrics": {
          "scenes": 12,
          "chunks": 6,
          "continued_scenes": 0,
          "scene_with_characters": 11,
          "scene_with_locations": 3,
          "kg_context_loaded": true,
          "kg_context_layer": "kg_lite",
          "scenes_concurrency": 1,
          "resumed": false
        }
      },
      "chronology": {
        "status": "ok",
        "duration_sec": 0.006,
        "metrics": {
          "scenes": 12,
          "chronology_groups": 12,
          "chronology_edges": 12,
          "chronology_conflicts": 0,
          "low_confidence_scenes": 1,
          "explicit_anchors": 2,
          "kg_context_layer": "kg_lite",
          "resumed": false
        }
      },
      "adaptation": {
        "status": "ok",
        "duration_sec": 187.046,
        "metrics": {
          "scenes": 12,
          "retain_scenes": 11,
          "compress_scenes": 1,
          "bridge_scenes": 0,
          "kg_context_layer": "kg_lite",
          "adaptation_concurrency": 1,
          "resumed": false
        }
      },
      "kg_deep": {
        "status": "ok",
        "duration_sec": 0.037,
        "metrics": {
          "input_entities": 41,
          "input_relations": 49,
          "kept_entities": 41,
          "kept_relations": 38,
          "scene_count": 12,
          "seed_entities": 5,
          "resumed": false
        }
      },
      "script": {
        "status": "ok",
        "duration_sec": 345.638,
        "metrics": {
          "scripts": 12,
          "shots": 36,
          "dialogue_lines": 19,
          "narration_shots": 12,
          "chronology_bound_scripts": 12,
          "chronology_non_mainline_scripts": 1,
          "chronology_reordered_scripts": 2,
          "adaptation_bound_scripts": 12,
          "kg_context_layer": "kg_deep",
          "script_concurrency": 1,
          "resumed": false
        }
      }
    },
    "quality_metrics": {
      "chunks": {
        "chunk_count": 6,
        "avg_chunk_chars": 1758.5,
        "max_chunk_chars": 1787,
        "avg_fill_ratio": 0.976944,
        "oversize_chunks": 0
      },
      "ontology": {
        "sample_count": 6,
        "sample_coverage_ratio": 1.0,
        "candidate_entity_types": 3,
        "candidate_relation_types": 6,
        "taxonomy_entity_types": 13,
        "taxonomy_relations": 6
      },
      "kg": {
        "entity_count": 43,
        "relation_count": 50,
        "observation_count": 166,
        "entity_per_chunk": 7.166667,
        "relation_per_chunk": 8.333333,
        "observation_per_chunk": 27.666667,
        "ambiguous_entity_forks": 1,
        "supplement_ratio": 1.0,
        "ontology_loaded": true
      },
      "type_consolidation": {
        "candidate_count": 33,
        "auto_apply_total": 18,
        "review_total": 12,
        "other_before": 7,
        "other_after": 2,
        "other_reduction": 5,
        "other_reduction_ratio": 0.714286,
        "ontology_loaded": true
      }
    }
  },
  "candidate_validation": {
    "artifact_paths": {
      "chunks": "outputs/kg_layer_smoke_20260328_v1/01_chunks.json",
      "ontology_samples": "outputs/kg_layer_smoke_20260328_v1/01b_ontology_samples.json",
      "ontology_candidates": "outputs/kg_layer_smoke_20260328_v1/01c_ontology_candidates.json",
      "ontology_doc": "outputs/kg_layer_smoke_20260328_v1/01d_ontology.json",
      "kg_store": "outputs/kg_layer_smoke_20260328_v1/02_kg_store.json",
      "kg_summary": "outputs/kg_layer_smoke_20260328_v1/02_kg.json",
      "kg_store_closure": "outputs/kg_layer_smoke_20260328_v1/02a_kg_store_closure.json",
      "kg_summary_closure": "outputs/kg_layer_smoke_20260328_v1/02a_kg_closure.json",
      "kg_closure_decisions": "outputs/kg_layer_smoke_20260328_v1/02a_kg_closure_decisions.json",
      "type_candidates": "outputs/kg_layer_smoke_20260328_v1/02b_type_candidates.json",
      "type_consolidation": "outputs/kg_layer_smoke_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": 6,
      "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.976944,
      "expected": {
        "min_avg_fill_ratio": 0.55
      }
    },
    {
      "id": "ontology.samples",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "samples meets minimum threshold",
      "actual": 6,
      "expected": {
        "min": 1
      }
    },
    {
      "id": "ontology.candidate_entity_types",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "candidate_entity_types meets minimum threshold",
      "actual": 3,
      "expected": {
        "min": 3
      }
    },
    {
      "id": "ontology.candidate_relation_types",
      "stage": "ontology",
      "status": "pass",
      "severity": "error",
      "message": "candidate_relation_types meets minimum threshold",
      "actual": 6,
      "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": 6,
      "expected": {
        "min": 4
      }
    },
    {
      "id": "kg.entities_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "entities_per_chunk meets minimum threshold",
      "actual": 7.166667,
      "expected": {
        "min": 1.0
      }
    },
    {
      "id": "kg.relations_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "relations_per_chunk meets minimum threshold",
      "actual": 8.333333,
      "expected": {
        "min": 1.0
      }
    },
    {
      "id": "kg.observations_per_chunk",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "observations_per_chunk meets minimum threshold",
      "actual": 27.666667,
      "expected": {
        "min": 8.0
      }
    },
    {
      "id": "kg.ambiguous_entity_forks",
      "stage": "kg",
      "status": "pass",
      "severity": "error",
      "message": "ambiguous entity forks stay within threshold",
      "actual": 1,
      "expected": {
        "max": 6
      }
    },
    {
      "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": 3,
        "supplement_chunks": 3,
        "ratio": 1.0
      },
      "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": 7,
        "other_after": 2
      },
      "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": 2,
      "expected": {
        "max": 3,
        "max_abs": 3,
        "max_ratio": 0.2
      }
    },
    {
      "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": 40,
      "expected": {
        "min_kept_entities": 1
      }
    },
    {
      "id": "kg_lite.kept_relations",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite kept enough relations",
      "actual": 49,
      "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": 40,
        "store_entity_count": 40
      },
      "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": 49,
        "store_relation_count": 49
      },
      "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": 40,
      "expected": {
        "max_source_entities": 41
      }
    },
    {
      "id": "kg_lite.relation_count_within_source",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite relation count stays within source KG",
      "actual": 49,
      "expected": {
        "max_source_relations": 49
      }
    },
    {
      "id": "kg_lite.decisions.cover_input_entities",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite decisions cover all input entities",
      "actual": 41,
      "expected": {
        "input_entity_count": 41
      }
    },
    {
      "id": "kg_lite.decisions.cover_input_relations",
      "stage": "kg_lite",
      "status": "pass",
      "severity": "error",
      "message": "kg_lite decisions cover all input relations",
      "actual": 49,
      "expected": {
        "input_relation_count": 49
      }
    },
    {
      "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": 37,
    "failure_count": 0,
    "warning_count": 0
  },
  "phase1_gate": {
    "status": "pass",
    "summary": {
      "check_count": 23,
      "failure_count": 0,
      "warning_count": 0
    }
  },
  "regression_report": {},
  "kg_lite_summary": {
    "source_entity_count": 41,
    "source_relation_count": 49,
    "kept_entity_count": 40,
    "kept_relation_count": 49,
    "summary_entity_count": 40,
    "summary_relation_count": 49,
    "store_entity_count": 40,
    "store_relation_count": 49,
    "decision_entity_count": 41,
    "decision_relation_count": 49,
    "dropped_entity_count": 1,
    "dropped_relation_count": 0,
    "source_kg_path": "02d_kg_consolidated.json",
    "source_kg_store_path": "02d_kg_store_consolidated.json",
    "strategy": "program_first_prune"
  },
  "status": "pass"
}