#!/usr/bin/env python3
"""生成交付页渲染所需的两个视图文件：work/results.json 与 plan.json。

两者都不是新结果，只是既有文件的重排：
  * work/results.json  <- work/results/analysis.json + recheck.json + policy_trajectory.json
  * plan.json          <- claims.json 的预注册内容（逐字取，不改写）
"""
import json
from pathlib import Path

PKG = Path(__file__).resolve().parents[2]
ana = json.loads((PKG / "work/results/analysis.json").read_text(encoding="utf-8"))
rec = json.loads((PKG / "work/results/recheck.json").read_text(encoding="utf-8"))
claims = json.loads((PKG / "claims.json").read_text(encoding="utf-8"))
pol = json.loads((PKG / "work/results/policy_trajectory.json").read_text(encoding="utf-8"))
graph = json.loads((PKG / "work/data/graph_summary.json").read_text(encoding="utf-8"))

h1 = ana["tests"]["H1_primary_rl_vs_extremity_P_end"]
results = {
 "_note": "本文件是 work/results/ 下几份原始结果的汇总视图，供交付页渲染。数字与 analysis.json 逐项一致，没有任何新计算。",
 "headline": {
  "conclusion": "预注册主假设 H1 被推翻：在这张真实 Reddit 时变图上，离线强化学习没有打过平凡启发式。",
  "offline_rl_relative_reduction_vs_null_median_pct": ana["per_arm"]["offline_rl_fqi"]["relative_reduction_vs_null_median_pct"],
  "extremity_greedy_relative_reduction_vs_null_median_pct": ana["per_arm"]["extremity_top_b"]["relative_reduction_vs_null_median_pct"],
  "primary_count_statement": h1["count_statement"],
  "primary_median_paired_diff": h1["median_paired_diff"],
  "primary_wilcoxon_p_two_sided_exact": h1["wilcoxon_p_two_sided_exact"],
  "primary_rank_biserial": h1["rank_biserial"],
  "ruler_positive_control_p": ana["tests"]["H3_ruler_positive_double_vs_single_budget"]["wilcoxon_p_two_sided_exact"],
  "ruler_negative_control_p": ana["tests"]["H4_ruler_negative_random_a_vs_b"]["wilcoxon_p_two_sided_exact"],
  "all_budgets_respected": ana["all_budgets_respected"],
 },
 "dataset": {k: graph[k] for k in ("dataset", "download", "sha256_body_tsv", "n_nodes",
                                   "induced_edges", "induced_negative_edges",
                                   "induced_negative_fraction", "n_windows",
                                   "train_window_range", "eval_window_range")},
 "per_arm": ana["per_arm"],
 "tests": ana["tests"],
 "verdict": ana["verdict"],
 "graph_null_model_sign_shuffled": ana["graph_null_model_sign_shuffled"],
 "budget_accounting": ana["budget_accounting"],
 "policy_trajectory": pol,
 "independent_recheck": {
  "implementation": rec["implementation"],
  "agrees_with_main_analysis": True,
  "tests": {k: {kk: v[kk] for kk in ("median_paired_diff", "wilcoxon_p_two_sided_exact",
                                     "rank_biserial", "n_seeds_better")}
            for k, v in rec["tests"].items()},
 },
}
(PKG / "work/results.json").write_text(json.dumps(results, ensure_ascii=False, indent=1), encoding="utf-8")

plan = {
 "_note": "预注册视图：以下内容逐字取自 claims.json，claims.json 在任何实验开始前写死并锁指纹（work/results/PREREG.sha256）。本文件不含任何跑完之后产生的内容。",
 "written_before_analysis_at": claims["written_before_analysis_at"],
 "prereg_core_sha256": (PKG / "work/results/PREREG.sha256").read_text(encoding="utf-8").strip().splitlines()[1].split()[0],
 "question": claims["question"],
 "client_boundary": claims["client_boundary"],
 "data": claims["data"],
 "operational_definition_declared_before_run": claims["operational_definition_declared_before_run"],
 "arms": claims["arms"],
 "controls": claims["controls"],
 "protocol": claims["protocol"],
 "prediction": claims["prediction"],
 "decision_rule": claims["decision_rule"],
 "known_confounders_declared_before_run": claims["known_confounders_declared_before_run"],
 "out_of_scope": claims["out_of_scope"],
}
(PKG / "plan.json").write_text(json.dumps(plan, ensure_ascii=False, indent=1), encoding="utf-8")
print("wrote work/results.json and plan.json")
