{
  "status": "DRAFT — 本番開始前にユーザーの最終承認が必要",
  "title": "地球に魔力は存在するか — 物理乱数への意図の影響を検証する参加型実験",
  "version": 3,
  "period": 1,
  "definition_of_magic": "人の意図と相関して、既知の物理的経路（筋力・熱・電磁気・音・振動など）を介さずに、物理系の確率的なふるまいを偏らせる作用",
  "primary_hypothesis": {
    "statement": "HIGH（「1」が多く出るように）と念じている間に読んだビットは、LOW（「0」が多く出るように）と念じている間に読んだビットより1の割合が高い",
    "unit": "ビット（試行の長さは参加者ごとに異なるため、念じた時間＝読んだビット数に比例した重みで数える）",
    "test": "2群の比率の差の z 検定。HIGH 試行の全ビットの1の割合と、LOW 試行の全ビットの1の割合を比べる。標準誤差は2群を合わせた1の割合から求める",
    "sides": "two-sided",
    "alpha": 0.005,
    "sample": "seq 順で先頭から、ビット数の累計が target_bits に達した試行までの、状態が final の参加者試行（対照試行・中断試行・sim の試行は除く）",
    "target_bits": 333000000,
    "target_rationale": "PEAR が報告した大きさの効果（HIGH と LOW の1の割合の差 0.0002）を、α=0.005（両側）で 80% の確率で検出できる数。念じた時間の合計で約 11.6 時間",
    "decision": "p < alpha かつ HIGH の1の割合 > LOW の1の割合なら『効果あり』。p < alpha で向きが逆なら『逆向きの効果』と報告する。それ以外は『検出されず』"
  },
  "secondary_analyses": {
    "note": "副次検定はすべて探索的。主検定の判定には使わない。参考として Bonferroni 補正（α/6）後の値も併記する",
    "S1": "対照試行（__calibration__）の HIGH 対 LOW（帰無仮説が成り立つはず）と、対照試行全体の1の割合と 0.5 の差（装置の偏り）",
    "S2": "信念が 4〜5 の参加者と 1〜2 の参加者で、効果（HIGH−LOW の差）が異なるか",
    "S3": "計測の間ずっと画面を表示していた試行（visible=true）だけでの主検定",
    "S4": "ボタンの押下率（held_ratio）が 0.8 以上の試行だけでの主検定",
    "S5": "魔力持ちの割合：試行が 10 回以上の参加者ごとに、ビット数で重みをつけた z（HIGH を +、LOW を −）から両側 p を求め、Storey の方法（λ=0.5）で偏りのない人の割合 π0 を推定し、1−π0 を報告する。95% 区間は参加者を単位にしたブートストラップ（1000 回）。対照として、対照試行を参加者と同じ人数・同じ試行数に分けて同じ計算をする。国・地域別（自己申告、対象者 30 人以上の国・地域のみ）も報告する",
    "S6": "念じた時間による違い：試行の長さが中央値以上の試行と未満の試行で、効果（HIGH−LOW の差）が異なるか。および、全試行を先頭 min_sample_seconds 秒だけに切りそろえた主検定"
  },
  "trial": {
    "prep_seconds": 3,
    "bits_per_second": 8000,
    "min_sample_seconds": 3,
    "max_sample_seconds": 600,
    "heartbeat_timeout_seconds": 5,
    "report_timeout_seconds": 20,
    "ready_timeout_seconds": 60,
    "chunk_record": "測定は1秒ごとに bits_per_second ビットを読み、各秒の1の数を chunk_ones に記録する",
    "flow": "指示（HIGH/LOW）を表示 → 参加者が測定ボタンを押す（押した時点でスタート）→ 準備 prep_seconds（押したまま待つ）→ 測定（参加者がボタンを押している間だけ続く。指を離すか、画面を離れるか、通信が heartbeat_timeout_seconds 秒途絶えると、その秒の終わりで止まる。ただし最短 min_sample_seconds 秒・最長 max_sample_seconds 秒）→ 結果を見る前に申告 → 確定。ready_timeout_seconds 以内にボタンが押されなければ『未開始』（測定なし）として記録する",
    "targets": [
      "HIGH",
      "LOW"
    ],
    "target_assignment": "Python の secrets モジュール（OS の暗号論的乱数）で試行ごとに等確率に割り当てる。測定用乱数とは別系統"
  },
  "calibration": {
    "interval_seconds": 30,
    "description": "参加者のいない対照試行を30秒ごとに実行する。課題の割り当て・測定の手順は参加者の試行と同じ。測定の長さは、直前に確定した参加者試行の長さと同じにする（まだなければ min_sample_seconds 秒）"
  },
  "participant_incentives": {
    "blocks": "確定した参加者試行は、その参加者の『ブロック』として表示する。金銭的な価値はなく、売買・換金はできない",
    "rarity": "念じた時間によるレア度（コモン 60秒未満、レア 60秒〜、エピック 300秒〜、レジェンド 600秒）",
    "stars": "指示どおりの向きの z が 2 以上で★、3 以上で★★、4 以上で★★★",
    "note": "レア度・★・ランキングは表示のためだけのもので、主検定・副次検定には使わない。参加者の行動（念じる時間など）に影響しうるため、開始前から開示しておく",
    "ranking": "念じた時間の合計と★の数のランキング（上位10位）。計測中ずっと画面を表示していた試行（visible=true）だけを数える。名前は本人が公開を選んだときだけ出す"
  },
  "periods": {
    "rule": "試行の条件（念じる時間の上限・ビット数など）や検定の方法を変えるときは、この期を終えて新しい期（period を1つ増やした新しい事前登録と新しい DB）として始める。期の途中で条件を変えない",
    "change_reason": "条件を変える理由は、途中の検定結果ではなく、運用上の理由（サーバー負荷・参加者の要望・装置の交換など）に限る。変えた日と理由を公開する",
    "combined_analysis": "全期を合わせた判定は、各期の主検定の z を、その期の対象ビット数の平方根で重みをつけて合算する（重み付き Stouffer 法）。α は各期と同じ 0.005（両側）。各期の単独の結果も必ず併記する",
    "common_window": "参考として、全期の試行を先頭 min_sample_seconds 秒（全期で最も短い値）に切りそろえ、同じ条件で比べた結果も報告する"
  },
  "rng_source": "hwrng",
  "rng_postprocessing": "なし（ハッシュやホワイトニングをしない生のビットを使う）",
  "exclusions": "なし。開始した試行は途中離脱を含めてすべて確定させる。サーバーの再起動で中断した試行は error として記録し、主検定の対象外とする（参加者の行動とは無関係なため）。スタートが押されなかった試行は測定データがないため error（not_started）として記録し、件数を報告する",
  "privacy": "IP アドレスは保存しない（レート制限のためにメモリ上でのみ使う）。国・地域は参加者の自己申告のみを使う"
}
