#!/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()