"""발행된 팩의 **스템 목록 + 바이트**를 기준선으로 굳힌다 (감사 3-A).

## 왜

    #94  cine_stage_direction  팩 v24 에 스템을 더했는데 지문이 안 움직였다
    1-E  prev_usage_clause     팩 v33 에 스템을 더했는데 지문이 안 움직였다

**하루에 두 번** 같은 결함을 냈다. 둘 다 **이미 발행된 팩에 스템만
추가**한 모양이다 — selector 도 팩 디렉토리 해시도 그대로라 완주한 스텝이
whole-step clean skip 하고, 고친 문안이 나가는 프롬프트까지 못 내려간다.

## 왜 이 모양인가 — 앞서 만든 dataflow 도구를 접었다

`audit_stem_fingerprint_coverage.py` 로 「어느 스템이 지문에 접히나」를
따라가 봤는데, 고칠 때마다 답이 바뀌었다:

    0개  → import 별칭(`... as _pu_stem_content`)을 안 따라감
    5개  → 조건부 fold 를 「덮였다」로 셈
    ?    → 팩 해시는 (모듈, **팩버전**) 쌍인데 모듈로만 봄

세 번째를 고치려면 `version=` 인자의 상수를 따라가야 하고, 그 다음엔
호출부 조건까지 따라가야 한다. **도구가 결함보다 커진다.**

★그래서 방향을 바꾼다. 「접혔나」를 자동으로 판정하지 않고, **「발행된
 팩이 바뀌었다」는 사실만 걸고** 사람이 그 자리에서 지문을 확인하게 한다.
 20줄이고, 오늘 두 번 난 결함을 둘 다 잡는다.

## 새 팩을 만들 때 vs 발행된 팩을 고칠 때

    새 팩 디렉토리      기준선에 **항목이 늘어난다** — 이 스크립트를 다시
                       돌려 굳히면 그만이다(정상)
    발행된 팩을 고침     기준선과 **어긋난다** — 시험이 빨강이고, 그때
                       「이 바이트가 지문에 접히나」를 확인한 뒤 굳힌다

    .venv/bin/python tools/prompt_measure/rebuild_pack_baseline.py
"""
from __future__ import annotations

import hashlib
import json
import pathlib
import sys

ROOT = pathlib.Path(__file__).resolve().parents[3]
PROMPTS = ROOT / "prompts/_base"
BASELINE = ROOT / "backend/tests/_baselines/published_packs.json"
SUFFIXES = (".md", ".json", ".txt")


def snapshot() -> dict:
    """`{"<module>/<version>": {"<stem>": "<sha12>"}}`.

    ★해시는 **스템마다** 남긴다. 디렉토리 하나로 뭉치면 「무엇이
     바뀌었나」를 시험이 못 말해 주고, 그러면 굳히기 버튼만 누르게 된다.

    ★**스템이 없는 팩 디렉토리도 빈 dict 로 넣는다** (2026-08-27 Codex
     BLOCK). 앞 판은 `if stems:` 로 걸렀는데, 그러면 빈 팩이 결과에 아예
     안 나타나 「빈 팩이 없나」를 보는 시험이 **공허**해진다 — 못 보는
     것을 「없다」로 읽는 그 자리를 시험이 스스로 만들었다.
    """
    out: dict = {}
    for pack in sorted(PROMPTS.glob("*/*")):
        if not pack.is_dir():
            continue
        out[f"{pack.parent.name}/{pack.name}"] = {
            f.name: hashlib.sha256(f.read_bytes()).hexdigest()[:12]
            for f in sorted(pack.iterdir())
            if f.is_file() and f.suffix in SUFFIXES
        }
    return out


def main() -> None:
    snap = snapshot()
    BASELINE.parent.mkdir(parents=True, exist_ok=True)
    BASELINE.write_text(
        json.dumps(snap, ensure_ascii=False, indent=1, sort_keys=True) + "\n",
        encoding="utf-8")
    n = sum(len(v) for v in snap.values())
    print(f"팩 {len(snap)}개 · 스템 {n}개 → {BASELINE}")


if __name__ == "__main__":
    sys.exit(main())
