{
  "$comment": [
    "**L2（価値契約）が名指ししてよい指標の許可リストと、各指標の null model。**",
    "L4＝人間の持ち分。**AIはこのファイルを書き換えない。**",
    "起案は 2026-09-04 に AI が出したが、**approved_by が入るまでどの指標も使えない。**",
    "",
    "【なぜ許可リストが要るか】",
    "picker が指標を選べる以上、**放っておいても動く指標を名指しすれば較正は完璧に見える。**",
    "系統的な楽観は回数で炙り出せるが、これは炙り出せない。",
    "だから **picker に指標を新設する権限を与えない** —— ゲーミングの自由度そのものを奪う。",
    "",
    "【なぜ null model が要るか】",
    "ゼロではなく「何もしなかった場合」に対して採点する。基準をゼロに置くと、",
    "**勝手に動く指標を選んだぶんがそのまま得点になる。**",
    "",
    "【2026-09-04 に測って分かったこと —— これが起案の骨格】",
    "**事業の指標は、どれも日次系列が足りず null model を作れない。**",
    "",
    "    運転台帳（出荷・失敗・介入・実費）  25日・日次      ← **いま作れるのはこれだけ**",
    "    ASC ダウンロード数                   9日（08-24〜09-02・08-29 欠落）",
    "    収入                                 covered_days 4",
    "    BigQuery（GSC export）              22日蓄積だが**主系から読む経路が無い**",
    "    GSC の手動スナップショット           4本。**日次系列ではない**",
    "    GA4                                  README のみ。データ無し",
    "",
    "**したがって第1版の許可リストは運営の指標しか持てない。**",
    "『事業の数字で価値を較正する』は、系列が貯まるまで**できない**。",
    "設計ノートのリスク①（統計的検出力が足りない）が、着手前に実測で出た形。",
    "",
    "【null model の作り方 —— 系列が短いので分解は使わない】",
    "トレンド＋季節性の分解には最低3〜4週が要る。いま持っているのは最長25日なので、",
    "**曜日効果の有無だけで2つに分ける。**",
    "",
    "    same_weekday_median … 同じ曜日の直近 k 回の中央値（曜日効果を持つ指標）",
    "    trailing_median     … 直近 n 日の中央値（曜日効果を持たない指標）",
    "    zero               … 0 のままが既定（0/非0 でしか読めない指標）",
    "",
    "これは simplememo-api の日次運転規律（**単日の率では何も決めない。実行の根拠にしてよいのは",
    "(a) 0/非0 で読める事実 と (b) 分母が20に達した累積だけ**）と同じ基準を、指標側に置いたもの。",
    "",
    "【tier の意味】",
    "  A … いま契約に使ってよい（日次系列があり、null model が作れる）",
    "  B … 系列が貯まれば A へ。**いつ・何件で移るかを条件に書く**（推測で早めない）",
    "  C … 使わない。理由を書く"
  ],
  "version": 1,
  "policy_owner": "human",
  "drafted_at": "2026-09-04",
  "drafted_by": "ai",
  "$approval_note": [
    "**approved_by が null の指標は、価値契約で名指しできない。**",
    "起案（drafted_by: ai）と承認（approved_by）は別の欄で、埋めるのは人。",
    "承認の単位は指標1件ずつ —— まとめて承認する欄は作らない。",
    "**「起案してあるから使ってよい」を作らない**のがこのファイルの目的なので、",
    "空欄のまま使える経路を後から足さないこと。"
  ],

  "metrics": [
    {
      "id": "shipping_day_rate",
      "name": "出荷日率",
      "tier": "A",
      "source": "data/autopilot-runs.json",
      "reader": "scripts/autopilot-runs.mjs",
      "direction": "up",
      "null_model": { "kind": "trailing_median", "window_days": 14 },
      "why_eligible": "**25日の日次系列がある。**運転台帳は機械が毎日書いており、欠測日も no_run として残る",
      "gaming_risk": "**出荷の粒度を細かくすれば上がる。**レーンFの保守だけの日も出荷日に数えるため。'publishing_day_rate' を併記しないと『公開面は動いていないのに出荷日率だけ伸びる』が起きる",
      "approved_by": "owner", "approved_at": "2026-09-04",
      "approval_evidence": "2026-09-04、オーナーが出荷日率・公開日率・未解消故障件数を直近14日の中央値と比較して評価する提案に『おねがい』と承認。対話での人間承認を記録。"
    },
    {
      "id": "publishing_day_rate",
      "name": "連続公開（レーンA〜Eの出荷がある日の率）",
      "tier": "A",
      "source": "data/autopilot-runs.json",
      "reader": "scripts/autopilot-runs.mjs",
      "direction": "up",
      "null_model": { "kind": "trailing_median", "window_days": 14 },
      "why_eligible": "同上。**レーンF（自己修復）を除くので、上の指標の粒度ゲーミングを打ち消す**",
      "gaming_risk": "薄い記事を量産すれば上がる。**内容の質は機械が判定できない**ので、この指標だけで価値を語らない",
      "approved_by": "owner", "approved_at": "2026-09-04",
      "approval_evidence": "2026-09-04、オーナーが出荷日率・公開日率・未解消故障件数を直近14日の中央値と比較して評価する提案に『おねがい』と承認。対話での人間承認を記録。"
    },
    {
      "id": "time_to_detect_hours",
      "name": "故障の検知までの時間（中央値）",
      "tier": "A",
      "source": "data/autopilot-runs.json",
      "reader": "scripts/autopilot-runs.mjs",
      "direction": "down",
      "null_model": { "kind": "trailing_median", "window_days": 28 },
      "why_eligible": "failed_at / detected_at を持つ行が n=8 ある。**ロードマップが唯一「明確に壊れている」と名指ししている指標**（実測 中央値13.4h / 最大70.8h に対し目標1h）",
      "gaming_risk": "**検知の定義を緩めれば下がる。**『台帳に行が立った時刻』を検知と呼んでいるので、行を早く立てるだけで改善に見える。分母（故障件数）も併記する",
      "approved_by": "owner", "approved_at": "2026-09-05",
      "approval_evidence": "2026-09-05、オーナーが tier A 残り3指標（検知までの時間・1出荷あたり実費・判定理由未記録率）の承認を問う3択（3件とも承認する／検知までの時間だけ承認／保留）に対し『3件とも承認する（推奨）』を選択。承認しても当日の点は動かない（#906 の実測 +0.0）ことと、検知時間は故障日の翌日しか契約できず、実費は副系が観測不能な点を併記して使うことを提示したうえでの選択。対話での人間承認を記録（Claude Code セッション session_013C7zrtf3P369vK7dyRiZdF）。"
    },
    {
      "id": "unresolved_failures",
      "name": "未解消の故障件数",
      "tier": "A",
      "source": "data/autopilot-runs.json",
      "reader": "scripts/autopilot-runs.mjs",
      "direction": "down",
      "null_model": { "kind": "trailing_median", "window_days": 14 },
      "why_eligible": "日次で機械が更新する。**0/非0 で読める**ので、系列が短くても意味を持つ",
      "gaming_risk": "**解消の判定を緩めれば下がる。**close_check が機械判定でない行（manual）を分けて数える",
      "approved_by": "owner", "approved_at": "2026-09-04",
      "approval_evidence": "2026-09-04、オーナーが出荷日率・公開日率・未解消故障件数を直近14日の中央値と比較して評価する提案に『おねがい』と承認。対話での人間承認を記録。"
    },
    {
      "id": "usd_per_shipped",
      "name": "1出荷あたりの実費",
      "tier": "A",
      "source": "data/autopilot-cost.json",
      "reader": "scripts/autopilot-runs.mjs",
      "direction": "down",
      "null_model": { "kind": "trailing_median", "window_days": 28 },
      "why_eligible": "実費台帳に11行。**既に KPI 定義（usd_per_shipped）を持っている**",
      "gaming_risk": "**副系の実費は観測できない**（16 run 分）ので、主系に偏った改善が全体の改善に見える。**分母のカバー率を必ず併記する**",
      "approved_by": "owner", "approved_at": "2026-09-05",
      "approval_evidence": "2026-09-05、オーナーが tier A 残り3指標（検知までの時間・1出荷あたり実費・判定理由未記録率）の承認を問う3択（3件とも承認する／検知までの時間だけ承認／保留）に対し『3件とも承認する（推奨）』を選択。承認しても当日の点は動かない（#906 の実測 +0.0）ことと、検知時間は故障日の翌日しか契約できず、実費は副系が観測不能な点を併記して使うことを提示したうえでの選択。対話での人間承認を記録（Claude Code セッション session_013C7zrtf3P369vK7dyRiZdF）。"
    },
    {
      "id": "eligibility_unrecorded_rate",
      "name": "判定理由が記録されていない棄却の率",
      "tier": "A",
      "source": "data/autopilot-runs.json",
      "reader": "scripts/autonomy-score.mjs",
      "direction": "down",
      "null_model": { "kind": "zero" },
      "why_eligible": "**2026-09-04 から積み始めた。**null model が zero なのは、目指す値が 0 で、放っておいても 0 には近づかないため（写しが無ければ必ず declined_unrecorded になる）",
      "gaming_risk": "**declined_by_design を既定にすれば下がる。**逆向きの検査（故障コードを設計どおりと書かせない）が既に入っている",
      "approved_by": "owner", "approved_at": "2026-09-05",
      "approval_evidence": "2026-09-05、オーナーが tier A 残り3指標（検知までの時間・1出荷あたり実費・判定理由未記録率）の承認を問う3択（3件とも承認する／検知までの時間だけ承認／保留）に対し『3件とも承認する（推奨）』を選択。承認しても当日の点は動かない（#906 の実測 +0.0）ことと、検知時間は故障日の翌日しか契約できず、実費は副系が観測不能な点を併記して使うことを提示したうえでの選択。対話での人間承認を記録（Claude Code セッション session_013C7zrtf3P369vK7dyRiZdF）。"
    },

    {
      "id": "app_downloads",
      "name": "App Store のダウンロード数",
      "tier": "B",
      "source": "../simplememo-ios/data/asc/<date>/app-downloads-standard.json",
      "reader": "（未着手）",
      "direction": "up",
      "null_model": { "kind": "same_weekday_median", "k": 4 },
      "promotes_when": "日次系列が28日そろう（2026-09-04 時点で9日・08-24〜09-02・08-29 が欠落）。**欠落日を0と数えない**",
      "blocked_by": [
        "**系列が足りない**（9/28日）",
        "**このリポジトリの CI から隣は見えない。**取得は ../simplememo-ios 側で走っており、公開リポジトリへ値を運ばない方針（data/publication-policy.json）。読む側をどこに置くかが未決"
      ],
      "gaming_risk": "**新規インストールは 5〜15/日**（simplememo-api の運転規律）。この分母では単日の増減に意味が無く、**28日そろっても効果量の有意判定は出ない。**使うなら方向的中のみ",
      "approved_by": null, "approved_at": null
    },
    {
      "id": "monthly_revenue",
      "name": "Apple暦月の推定受取額",
      "tier": "B",
      "source": "../simplememo-ios/data/revenue/periods/latest.json",
      "reader": "../simplememo-ios/scripts/asc_revenue_periods.rb（取得・集計。価値判定への接続は未完了）",
      "direction": "up",
      "null_model": { "kind": "trailing_median", "window_days": 28 },
      "promotes_when": "比較する複数の暦月の完全性と訂正を確認し、非公開側でnull model・評価方法を実装して承認する。日次28日の到達や月額への外挿で昇格しない。",
      "blocked_by": ["前月との比較期間・価値判定の読み手・評価方法が未完了。日次の写しに金額は無く、日次・週次・月次を加算しない。"],
      "gaming_risk": "価格やプランを変えれば動くが、**それは R2（不可逆・オーナー判断）**なので picker は触れない。したがってこの指標での改善は間接的にしか作れない",
      "approved_by": null, "approved_at": null
    },
    {
      "id": "gsc_clicks",
      "name": "検索流入のクリック数",
      "tier": "B",
      "source": "BigQuery（GSC export）",
      "reader": "（未着手）",
      "direction": "up",
      "null_model": { "kind": "same_weekday_median", "k": 4 },
      "promotes_when": "28日蓄積（2026-09-04 時点で 22日）**かつ**主系から読む経路ができること",
      "blocked_by": [
        "**主系（GitHub Actions）に BigQuery の資格情報が無い**（data/autopilot-status.json の data_freshness が『見に行けなかった』と記録している）",
        "**手動スナップショット（growth/data/gsc/）では代用できない** —— 4本しかなく日次系列ではないので、窓が動くと『増えた／減った』が測れない"
      ],
      "gaming_risk": "**曜日効果が大きい**（gsc_weekday_factor が既に KPI 定義にある）。same_weekday_median を使う理由がそれ",
      "approved_by": null, "approved_at": null
    },

    {
      "id": "change_failure_rate",
      "name": "変更失敗率",
      "tier": "C",
      "source": "data/autopilot-runs.json",
      "why_excluded": "**自律スコアが意図して除外している指標**（data/autonomy-score.json の anti_gaming.failure_rate_excluded）。契約の指標に入れると、除外した意味が裏口から消える —— 死亡率を最適化対象にした瞬間、チェックを緩める圧力が生まれる",
      "approved_by": null, "approved_at": null
    },
    {
      "id": "autonomy_score",
      "name": "自律スコアそのもの",
      "tier": "C",
      "source": "scripts/autonomy-score.mjs",
      "why_excluded": "**計器を最適化対象にしない。**契約の指標にすると ranker に見せることになり、`--check` が実際に落とす（anti_gaming.hidden_from_ranker）",
      "approved_by": null, "approved_at": null
    },
    {
      "id": "overall_automation_rate",
      "name": "総合自動化率（タスク被覆率）",
      "tier": "C",
      "source": "data/automation-coverage.json",
      "why_excluded": "**分母が棚卸しで動く。**2026-08-25 に13件足したとき 61.3% → 58.6% に下がっている。契約の指標にすると『棚卸しをしない』が最適戦略になり、台帳の正確さと利益相反する",
      "approved_by": null, "approved_at": null
    }
  ]
}
