MODULE_VERSIONS = {
    "auth_service": "1.0.0",
    "user_service": "1.0.0",
    "project_service": "1.0.0",
    "activity_logger": "1.0.0",
    "pdf_parser": "1.0.0",
    "entity_extractor": "1.5.0",             # 2026-05-21 — e2e-review-fix-v1 Wave3: entity_extractor_v2 v12 — active stem(system.md 변형 허용/금지 예시, turn0_style.md hardcoded era·region·clothing 예시) 닫힌 목록·시나리오 leak 추상화. C8 v11 은 dead stem turn2.md 만 수정 (cosmetic). 이전: 1.4.0 v11 (C8) / Area B metadata_json.visual_identity SOT + render_contracts[]
    "scene_still_extractor": "1.0.0",
    # "analysis_service" 제거 — Phase 4.2: StepRunner 경로로 수렴 (analysis_dispatch_service로 대체)
    "gemini_image_client": "1.1.0",       # 2026-03-15T14:00:00 — ModerationError, moderation block detection, response timing
    "world_guide_generator": "1.1.0",     # 2026-04-20 — v6 prompt: 한국·근미래 하드코딩 제거, world_guide_block 존중
    "entity_dependency": "1.0.0",         # 2026-03-16 — visual dependency graph for entity image generation ordering
    "reference_image_generator": "1.3.0",  # 2026-04-20 — v6 prompt: 한국·근미래 하드코딩 제거, era/region은 world_guide_block이 결정
    "scene_image_generator": "1.4.0",     # 2026-04-20 — v6 prompt: 한국·근미래 하드코딩 제거, world_guide 존중
    "t2i_prompt_composer": "1.0.0",        # 2026-03-16 — T2I prompt composer: scene description -> cinematic + closeup prompts
    # (2026-03-16) image_service 1.7.0 — 아래 1.8.0으로 대체됨
    "image_validator": "1.0.0",           # 2026-03-15T14:00:00 — GPT-5.4 vision quality validator, prompt_dep: image_validation/v1
    "entities_api": "1.0.1",              # 2026-03-15T11:00:00 — episode list in detail response
    "webbook_generator": "1.1.0",         # 2026-03-15 — section-level opening/closing paragraphs, still coverage validation
    "pdf_renderer": "1.1.0",              # 2026-03-15 — section titles, image captions, dividers, named layout constants
    "pdf_validator": "1.0.0",             # 2026-03-15 — GPT vision-based PDF quality validation
    "prompt_sanitizer": "1.1.0",          # 2026-03-15T22:30:00 — 3 photorealistic strategies (film_previs, movie_poster, aftermath)
    "generation_tracker": "1.0.0",        # 2026-03-15T14:00:00 — Opik-style T2I generation trace logging
    "provenance": "1.0.0",               # 2026-03-15T15:00:00 — Pipeline operation provenance recorder, Opik-compatible
    "progress_tracker": "1.0.0",          # 2026-03-15 — Pipeline progress tracking for UI polling
    "variation_recommender": "1.0.0",     # 2026-03-16 — A/B variation recommender (angle/color)
    "gemini_i2i_editor": "1.0.0",         # 2026-03-16 — Gemini i2i angle/color editor
    # shot-more (v0.5.0 — 2026-04-15)
    "shot_extractor": "2.6.0",            # 2026-07-23 — E2E13 fix①: v17 prompt(키샷 가치 관통 — 역할 재정의 정지 순간→동영상 키샷, 무근거 정면·고정·멈춘 정적 연출 금지, 운동 정점 포착 허용, 시선 기하 물리 정합. v16 계약 전체 승계). 이전: 2.5.0 — 2026-07-08 발명 경계 wave1: v16 prompt(배경 시각 특징=원문 실재만, 무근거 날씨·광원 색·재질·표면 상태 발명 금지+스타일 요약=톤 참고). 이전: 2.4.0 v15 prompt — user.md:48 rule_type enum 목록 raw 중괄호 → 이중 중괄호 escape (user_template.format() KeyError 크래시 fix, 금월도 E2E blocker). v14→v15 user.md 1 line escape only, system.md byte-identical; shot_schema.json 은 v10 per-stem fallback 유지 (C5 OPTION_1). 이전: 2.3.0 v14 (C8).
    "shot_validator": "1.5.0",            # 2026-05-20 — C5 v1: v6 prompt — 시간 연결어·locomotion·active-contact·visible-human-action 닫힌 lexicon 추상화 (generic semantic principle, A082/A083). contract 변경 0. 이전: 1.4.0 v4 (G4.6 RC-F+RC-G).
    "shot_selector": "4.2.0",             # 2026-07-23 — E2E13 fix①: v7 prompt(키샷 커버리지+B축 재정의 — 단순 자세 보상 제거, 증명사진류 단독 선택 금지). 이전: 4.1.0 — 2026-04-19 v4 prompt: 2중 캡(절대+비율 50%), reason 필수, 작은 씬 과선택 방지 + 2026-05-20 C8: v5 — 연결순간 카테고리 닫힌 목록 추상화
    "scene_camera_flow": "1.4.0",         # 2026-08-13 — 포즈≠앵글 Codex 리뷰 반영: v5 prompt — 허용 예외를 표현 층으로 한정(원문이 관객에게 보이는 화면 구도를 직설한 문장만 — "카메라를 똑바로 응시한다" 류. 촬영·초상 사건 서술("증명사진을 찍는다")은 근거 아님 명문 — v4 예시가 사건 서술이라 포즈·앵글을 도로 합치던 결함) + 직면·대치 정면성은 상대를 향한 정면으로. 이전: 1.3.0 — 2026-08-13 포즈≠앵글 분리(사용자 원칙): v4 prompt(미커밋 중간판 — 00:52 force 1회 소비 후 v5 로 대체). 정면 재현은 씬 원문 직설에만, 장면 안 카메라·관객이 있어도 영화적 각 독립 선택. S65sh10 카나리아 육안 반려가 근거. 이전: 1.2.0 — 2026-08-12 카메라 문법 재료 wave: v3 prompt(높이·각도·배치 문법 재료, 높이 단일화 회피, 인물 정면 배치=근거 있을 때만 — 이 표현이 포즈와 앵글을 한 덩어리로 처리한 것이 v4 의 수정 대상). step _config_hash 에 팩 내용 해시 도입. 이전: 1.1.0 — 2026-07-08 발명 경계 wave2: v2 prompt. 이전: 1.0.0 신규 step (gemini-pro)
    "shot_staging": "2.13.0",             # 2026-08-13 — 포즈≠앵글 Codex 리뷰 반영: v22 prompt — 정면 허용 문 4곳(:121 특별한 이유/:129 원문 직설/:136 직면·고발·초상/:157 enum 주석)을 단일 기준(원문이 화면 구도를 직설)으로 정렬 + 사건 서술은 근거 아님 명문 + 직면은 상대를 향한 정면으로 + 군중 절 재저작(집단 사실=원문 보존, 개인 위상만 비동기화, 행동 발명 금지 — v21 "방향을 흩뜨리세요"가 행렬 진행 방향까지 흩뜨리고 대화를 발명하던 결함). 이전: 2.12.0 — 2026-08-13 포즈≠앵글 분리(사용자 원칙): v21 prompt(미커밋 중간판, 미소비 — v22 로 대체). 렌즈 직시·정면 재현·도열은 씬 원문 직설 명시에만 + 군중·행렬 복제 금지 절 신설. 이전: 2.11.0 — 2026-08-12 카메라 문법 재료 wave: v20 prompt(시선·몰입을 camera_direction **산문**에 — 하류 스틸 프롬프트에 전달되는 문장이 그것뿐이라는 실측이 근거. 렌즈 도열=기록·의례 명시 시만, 플로우 계승과 무충돌 명문). 이전: 2.10.0 — 2026-07-23 E2E13 fix①⑧: v17 prompt(키샷 연출 가치 — 정면 기계적 매핑 금지+ECU 의미 요소 유지 / 시선 기하 물리 계약. v16 계약 전체 승계). 이전: 2.9.0 — 2026-07-08 발명 경계 wave1+3: v16 prompt(세계 사실 근거 경계+근거 위계+환경 프레이밍 조건부+lighting_mood 중립)+creator_corrections_block 주입 채널. 이전: 2.8.0 v15 prompt — schema oneOf 2곳 제거 (OpenAI strict structured-output 호환: frame_spatial_contract → type:[object,null] nullable, character_angles.items 조건부 oneOf 제거 + gaze_target_id required nullable). kind↔target pairing 강제는 shot_staging 코드측 validate_pairing 으로 이동. schema_version 5→6 (gaze_target_id required-null field-shape 변경). 이전: 2.7.0 v14 (C1 perception_mode).
    "scene_detail_composer": "1.42.0",    # 2026-08-12 — 차렷/증명사진 대응 v42: 시선·카메라 인지 기본값(staging 침묵 시만) + identity 참조 역할 한정. prompt-only, schema_version 13 유지. ★주의: recipe(bgfirst) 스틸 프롬프트는 t2i 를 소비하지 않아(의상 배정만) 이 판의 효과는 legacy 단일 T2I 경로·UI 노출에 한정 — 스틸 유효 층은 scene_camera_flow v3/shot_staging v20 (같은 날 wave). 이전: 1.41.0 — 2026-08-04 E2E 실패 대응 v41: 정책 배열 미명시 시 기본값(id_and_outlook_required) 상기 복원 + 비인간 subject 동일 적용. prompt-only, schema_version 13 유지. 이전: 2026-08-04 — 육안 판정 대응 v40: 프레임 점유율 관할 / 재현 표면의 놓인 자세 / bg_id 산문 노출 3건에 재료 추가. prompt-only, schema_version 13 유지. 이전: 2026-08-04 — prompt diet ③: v38 카드 중복 산문 제거 → v39 재현 표면 조항 복원(육안 반려 대응). prompt-only, schema_version 13 유지. 이전: 1.37.0 2026-07-08 발명 경계 wave3: v37 prompt(세계 사실 근거 경계+CREATOR CORRECTIONS 최우선). 이전: 1.36.0 육안 6결함 wave: v36 prompt(의류 명사 아웃룩 정의 한정+씬 내 동일 표현, 이동체 방향 일관성). 이전: 1.35.0 W20F2: v35 prompt — entity_canon.name ±60 char window hard-rule 을 권고로 강등 (자연어 substring + character-window 의미 판단 SOT 부적합). 구조화 SOT (id_policy.subject_reference_policy / visible_entities / required_refs) 유지. prompt-only; schema_version 13 유지. 이전: 1.34.0 v34 (Phase3 W3 generic_descriptor_allowed).
    "image_service": "1.9.0",             # 2026-04-20 — zoom_in_detail ref_usage label 추가 (SAME FRAME ZOOMED)
    "scene_consistency": "2.6.0",         # 2026-05-20 — Carry-P021: v8 prompt — scene_consistency v7 system.md hard-prime examples abstracted. content-only abstraction, schema byte-identical, schema_version=3 preserve. Area #4 boundary preserve (producer code 변경 0).
    "location_consistency": "1.2.0",      # 2026-04-20 — v2 prompt: 실 수치 제거(상대 크기만), 한국·어선 편향 예시 → 거주/야외 혼합 + 2026-05-20 C8: v3 — 환경상태 닫힌 영문 토큰 목록 추상화
    "character_state_variant": "1.0.0",   # 2026-04-15 — dead/injured/unconscious 인물 variant 참조 이미지 생성
    "shot_dependency_t2i": "1.5.0",       # 2026-05-20 — C7: keep_elements[].subject_kind structured signal 신설 (non_human_visual_element / human_or_character_reference enum). producer-emit subject_kind 소비 + human_or_character_reference fail-fast. v8 prompt + schema_version=4. 이전: 1.4.0 v7 schema_version=3 (Area D-next-min, kind enum 2종, immobilized_character 폐기). archive: 2026-05-14 D-next 시도 (v6 + immobilized_character) — see archive/area-d-next-immobilized-attempt.
}

# Module metadata: prompt dependencies and update timestamps.
_MODULE_INFO = {
    "entity_extractor": {
        # Wave3 (2026-05-21, e2e-review-fix-v1): active prompt stem hygiene — C8 v11 은 dead stem turn2.md 만 추상화 (cosmetic), 실제 active leak 은 system.md/turn0_style.md 에 잔존 → v12 에서 추상화.
        "prompt_dependency": "entity_extractor_v2/v12",
        "updated_at": "2026-05-21",
    },
    "scene_still_extractor": {
        "prompt_dependency": "scene_stills/v2",
        "updated_at": "2026-03-15T15:00:00",
    },
    "world_guide_generator": {
        "prompt_dependency": "prototype_prompts/v6",
        "updated_at": "2026-04-20",
    },
    "entity_dependency": {
        "prompt_dependency": None,
        "updated_at": "2026-03-16",
    },
    "reference_image_generator": {
        "prompt_dependency": "prototype_prompts/v6 + reference_image/v2",
        "updated_at": "2026-04-20",
    },
    "t2i_prompt_composer": {
        "prompt_dependency": "t2i_composer/v1",
        "updated_at": "2026-03-16",
    },
    "scene_image_generator": {
        "prompt_dependency": "prototype_prompts/v6",
        "updated_at": "2026-04-20",
    },
    "webbook_generator": {
        "prompt_dependency": "prototype_prompts/v5",
        "updated_at": "2026-03-15T15:00:00",
    },
    "image_validator": {
        "prompt_dependency": "image_validation/v1",
        "updated_at": "2026-03-15T14:00:00",
    },
    "pdf_validator": {
        "prompt_dependency": "pdf_validation/v1",
        "updated_at": "2026-03-15T15:00:00",
    },
    "prompt_sanitizer": {
        "prompt_dependency": "prompt_sanitizer/v1",
        "updated_at": "2026-03-15T22:30:00",
    },
    "provenance": {
        "prompt_dependency": None,
        "updated_at": "2026-03-15T15:00:00",
    },
    "progress_tracker": {
        "prompt_dependency": None,
        "updated_at": "2026-03-15",
    },
    "variation_recommender": {
        "prompt_dependency": "variation_recommender/v1",
        "updated_at": "2026-03-16",
    },
    "gemini_i2i_editor": {
        "prompt_dependency": None,
        "updated_at": "2026-03-16",
    },
    # shot-more (v0.5.0+ — 2026-04-15 이후)
    "shot_extractor": {
        "prompt_dependency": "shot_extract/v17",
        "updated_at": "2026-07-23",  # E2E13 fix① — 키샷 가치 관통 주입
    },
    "shot_validator": {
        "prompt_dependency": "shot_validator/v6",
        "updated_at": "2026-05-20",
    },
    "shot_selector": {
        "prompt_dependency": "shot_selection/v7",
        "updated_at": "2026-07-23",  # E2E13 fix① — 키샷 커버리지·B축 재정의
    },
    "scene_camera_flow": {
        "prompt_dependency": "scene_camera_flow/v5",  # 포즈≠앵글 리뷰 반영 — 예외=화면 구도 직설 문장만, 사건 서술 제외 (2026-08-13)
        "updated_at": "2026-08-13",
    },
    "shot_staging": {
        "prompt_dependency": "shot_staging/v22",  # major suffix only — 정면 허용 4곳 단일 기준 정렬+군중 절 재저작 (2026-08-13). 이전 v20: 시선·몰입 산문 반영
        "updated_at": "2026-08-13",
    },
    "scene_detail_composer": {
        "prompt_dependency": "scene_detail/v42",  # major suffix only — v42 차렷/증명사진 대응(시선 기본값+identity 역할 한정, 2026-08-12). alignment test enforces "v##" suffix matching latest. 이전 v41(정책 기본값 상기)·v40(육안 판정 대응)·v39(재현 표면 복원, prompt diet ③).
        "updated_at": "2026-08-12",
    },
    "scene_consistency": {
        "prompt_dependency": "scene_consistency/v8",
        "updated_at": "2026-05-20",  # Carry-P021 v8 prompt — hard-prime examples abstracted
    },
    "location_consistency": {
        "prompt_dependency": "location_consistency/v3",
        "updated_at": "2026-05-20",
    },
    "character_state_variant": {
        "prompt_dependency": "character_state_variant/v1",
        "updated_at": "2026-04-15",
    },
    "shot_dependency_t2i": {
        "prompt_dependency": "shot_dependency_t2i/v9",
        "updated_at": "2026-08-04",  # v9 — schema description 을 system.md 포인터로 (prompt diet ⑦). 출력 shape 불변.
    },
}


def get_module_info(module_name: str) -> dict:
    """Returns {"version": ..., "prompt_dependency": ..., "updated_at": ...}."""
    version = MODULE_VERSIONS.get(module_name, "0.0.0")
    info = _MODULE_INFO.get(module_name, {})
    return {
        "version": version,
        "prompt_dependency": info.get("prompt_dependency"),
        "updated_at": info.get("updated_at"),
    }
