"""JD-parse phase — load JD → objective (keywords) + subjective → ONE combined jd_extraction.json (live, Qwen3). ``run_jd_parse`` writes the single JSON each run (objective keyword fields + ``subjective.ideal_summary``); ``extract_spec`` / ``read_subjective`` consume it. Live-only — when the JSON is absent, ``extract_spec`` returns an empty default spec (no committed fallback). Each part is independently testable. """ from .pipeline import run_jd_parse from .spec import JDSpec, embed_query, extract_spec, read_subjective __all__ = [ "JDSpec", "embed_query", "extract_spec", "read_subjective", "run_jd_parse", ]