"""v2_chunk 에서 `episode_reference_policy` 가 참조 의무를 거나 — **실측**.

무료. 프로덕션 스텝 객체를 그대로 만들고 그 메서드를 부른다.
"""
import json, os, sys, tempfile, pathlib

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.chdir("/Users/manta/Documents/Projects/TheRoad-I1/backend")
sys.path.insert(0, "/Users/manta/Documents/Projects/TheRoad-I1/backend")

from app.core.config import settings

tmp = tempfile.mkdtemp()
settings.projects_dir = tmp
PID, EID = "probe-project", "probe-episode"
root = pathlib.Path(tmp) / PID / "checkpoints" / "episodes" / EID


def put(step, data):
    d = root / step
    d.mkdir(parents=True, exist_ok=True)
    (d / "manifest.json").write_text(
        json.dumps({"status": "completed", "data": data}, ensure_ascii=False),
        encoding="utf-8")


# ★중앙 획득이 **참조를 실제로 골라 둔** 판을 만든다.
from app.modules.pipeline.reference_acquisition import STATUS_SELECTED

put("reference_acquisition", {
    "rows": [
        {"owner_type": "character", "research_subject_id": "s1",
         "final_id": "C01", "status": "bound",
         "acquisition_outcome": STATUS_SELECTED},
        {"owner_type": "location_part", "research_subject_id": "s2",
         "final_id": "LP01", "status": "bound",
         "acquisition_outcome": STATUS_SELECTED},
    ],
    "unresolved": [], "target_count": 2, "selected_count": 2,
})

from app.core.steps.episode_reference_policy_step import (
    EpisodeReferencePolicyStep as S)

step = S.__new__(S)
step.project_id, step.episode_id = PID, EID
# ★`db=None` 이면 첫 줄에서 바로 돌아온다 — 그 지름길이 답을 설명하면
# 안 되므로 **DB 는 있고 행이 없는** 판으로 둔다.


class _Q:
    def filter(self, *a, **k):
        return self

    def all(self):
        return []


class _DB:
    def query(self, *a, **k):
        return _Q()


step.db = _DB()
step.project_config = {"grounding_mode": "v2_chunk"}

forced, blocked = step._research_forced_short_ids()
print("중앙 CP 가 고른 참조 :", ["C01", "LP01"])
print("정책 스텝이 강제한 것:", sorted(forced))
print("정책 스텝이 막은 것  :", sorted(blocked))
print()
print("→ 강제 0개면 하류(render_prompt_card.research_forced_refs)가"
      " 받을 것이 없다")
