#!/usr/bin/env python3
"""exp14 Ступень II — слепой пакет владельцу: 3 ФИНАЛИСТА на 3 главах (гл.19/17/18), под
нейтральными метками, ключ ОТДЕЛЬНО. Копирайт: книжный текст ВНЕ git (exp14/monitor/).

Финалисты: Fin-A=P0 (текущий прод baseline) · Fin-B=A-2pass (лучший near-term, дешёвый) ·
Fin-C=F-disc (фронтир gpt-5.4, дискурс). Per-глава seeded-shuffle меток (V1..V3 — РАЗНАЯ
модель в каждой главе; ключ владелец не открывает до ранжирования).
"""
from __future__ import annotations
import json, random
from pathlib import Path
import exp14_common as C

ARMS = C.DIAG / "arms"
MAT = json.load(open(C.DIAG / "material.json"))
OUT = C.DIAG / "monitor"; OUT.mkdir(exist_ok=True)
FINALISTS = {"Fin-A": "P0", "Fin-B": "A-2pass", "Fin-C": "F-disc"}
CHAPTERS = [19, 17, 18]
SALT = "exp14-monitor-blind-v1"


def chapter_text(arm: str, ch: int) -> str:
    chunks = sorted(u["chunk_idx"] for u in MAT["stage2"][str(ch)])
    parts = []
    for ck in chunks:
        p = ARMS / arm / f"{ch}.{ck}.txt"
        parts.append(p.read_text(encoding="utf-8") if p.exists() else f"[[MISSING {arm} {ch}.{ck}]]")
    return "\n\n".join(parts)


def main():
    missing = [(f, a, ch) for f, a in FINALISTS.items() for ch in CHAPTERS
               for ck in sorted(u["chunk_idx"] for u in MAT["stage2"][str(ch)])
               if not (ARMS / a / f"{ch}.{ck}.txt").exists()]
    if missing:
        print("⚠ отсутствуют выходы (арм ещё не готов):", missing[:10]); return

    key = {}
    md = ["# Слепое чтение — exp14 Ступень II (3 варианта × 3 главы)\n",
          "Прочти каждую главу в ТРЁХ вариантах (V1/V2/V3 — порядок в каждой главе РАЗНЫЙ). "
          "Для каждой главы: (1) какой вариант читается лучше как русская проза «лучше фана» — ранжируй V1>V2>V3; "
          "(2) закрыты ли обе претензии (абзацы/конвенции; понимание связей/смысла); (3) любые смысловые ляпы. "
          "Ключ (какая модель под какой меткой) — в отдельном файле `_КЛЮЧ.json`, открой ПОСЛЕ.\n",
          "D-плотность диалога: гл.19=0.061 (нарратив), гл.17=0.246 (смешанная), гл.18=0.440 (диалог).\n"]
    for ch in CHAPTERS:
        order = list(FINALISTS); random.Random(f"{SALT}-{ch}").shuffle(order)
        labels = {f"V{i+1}": order[i] for i in range(len(order))}
        key[str(ch)] = {lab: {"finalist": fin, "arm": FINALISTS[fin]} for lab, fin in labels.items()}
        md.append(f"\n\n---\n\n## Глава {ch}\n")
        for i in range(len(order)):
            lab = f"V{i+1}"; fin = labels[lab]
            md.append(f"\n### {lab}\n\n{chapter_text(FINALISTS[fin], ch)}\n")
    (OUT / "monitor14.md").write_text("\n".join(md), encoding="utf-8")
    (OUT / "_КЛЮЧ.json").write_text(json.dumps(
        {"salt": SALT, "finalists": FINALISTS, "per_chapter": key}, ensure_ascii=False, indent=1), encoding="utf-8")
    print(f"→ {OUT/'monitor14.md'} (3 главы × 3 слепых варианта)")
    print(f"→ {OUT/'_КЛЮЧ.json'} (НЕ открывать до ранжирования)")
    for ch in CHAPTERS:
        print(f"  гл.{ch}: " + ", ".join(f"{lab}={key[str(ch)][lab]['finalist']}" for lab in ("V1","V2","V3")))


if __name__ == "__main__":
    main()
