{
  "$comment": [
    "運転台帳 — 1回のオートパイロット実行を1行で表す。**共通実行ID（run_id）が背骨。**",
    "",
    "【なぜ必要か】2026-08-22の外部レビューが指摘したとおり、この運用は",
    "『1つの改善サイクルが完走したか』を機械的に言えなかった。AI完走率・人間介入率・",
    "変更失敗率・改善サイクル時間は、どれも実行を一意に指す識別子が無ければ数えられず、",
    "『手で数えた値』にしかならない。growth/README.md の冒頭が戒めている",
    "『計画は散文の中に住んでいて、散文は手を挙げない』のは、指標についても同じ。",
    "",
    "【何を1行にするか】Issue/レーン選定 → ブランチ → PR → 検証 → 配信 → 費用 → 人間の介入。",
    "run_id は `ap-<YYYYMMDD>-<route>`。GitHub Actions の run id は external_ref に持ち、",
    "実費台帳（data/autopilot-cost.json）とはそのキーで結合する。**費用をここに複製しない**",
    "（同じ数字の出所が2つあると必ず食い違う）。",
    "",
    "【attempted の意味】『着手したか』。秘密鍵未設定によるGateスキップと、",
    "他経路が先行したことによる冪等スキップは attempted=false。**完走率の分母は attempted。**",
    "着手していない回を失敗に数えると、意図した『静かに寝る』設計が失敗率として現れてしまう。",
    "",
    "【outcome の値】",
    "  shipped           … 本番へ出荷（PRがマージされた）",
    "  no_artifact       … 実行したが成果物ゼロ（費用は発生している）",
    "  failed / cancelled… ジョブが落ちた／打ち切られた",
    "  skipped_gate      … 秘密鍵未設定で意図的に寝た（attempted=false）",
    "  skipped_duplicate … 他経路が先行していたので何もせず終了（attempted=false・正常系）",
    "  no_run            … その日どの経路も動かなかった（**これは異常**）",
    "",
    "【source は必ず書く】どの一次資料から起こした行かを残す。後から検算できない行は、",
    "指標としては存在しないのと同じ。",
    "",
    "【interventions.kind — 「何への介入か」で分ける】",
    "  artifact   … **出荷物そのものへの介入**（人が記事を書いた・書き直した）",
    "  infra      … 実行基盤の修理（ワークフロー・Runbook・スクリプト）",
    "  substitute … 全経路が不発で人が代走した",
    "  bootstrap  … 立ち上げ時に人が通しで実演した（一度きり）",
    "  request    … 人に起票しただけ（まだ実行されていない）",
    "",
    "この分類が無いと、YAMLの権限を1行直した日と、人が記事を書き直した日が",
    "同じ『介入あり』になる。**両者はAIの自律性について正反対のことを言っている。**",
    "前者は基盤が脆いという話で、後者は成果物が信用されていないという話。",
    "集計（scripts/autopilot-runs.mjs）は総計と内訳の**両方**を出す。",
    "総計だけ出すと過少評価になり、内訳だけ出すと都合のよい分母選びになる。",
    "",
    "【failure_class と repair_of — 自己修復のための2フィールド】",
    "  failure_class … 故障の**種別**（permissions / runner-timeout / actor-rejected /",
    "                  route-absent / runbook-gap）。同じ故障の再発を数えるために要る。",
    "                  失敗の自由文（failure_reason）だけでは『前と同じ故障か』が判定できない。",
    "  repair_of     … その実行が修理した run_id の配列。**修理が効いたかを後から追える。**",
    "",
    "この2つで scripts/autopilot-selfheal.mjs が『未修理の故障が残っているか』を判定し、",
    "残っていればその日の最優先アクションをレーンF（自己修復）にする。",
    "同じ failure_class を規定回数直しても再発するなら、**修理をやめて人間に上げる**",
    "（直せないものを毎日直そうとするのが一番たちの悪い無限ループになる）。",
    "",
    "【failed_at / detected_at / resolved_at — MTTRのための3点】",
    "  failed_at   … 故障が起きた時刻",
    "  detected_at … **誰かが気づいた時刻**。ここが無いとMTTRは出せない",
    "  resolved_at … 修理が本番へ出た時刻（PRマージ）",
    "",
    "検知までの時間（detected_at - failed_at）と修理までの時間（resolved_at - detected_at）は",
    "**別の指標**。前者は監視の穴、後者は修理能力の話で、混ぜると改善先を間違える。",
    "実測では 2026-08-16 の無運転が検知まで**50時間**かかっている（副系Routineが",
    "そもそも存在しなかった期間）。一方いったん気づいてからの修理は1時間以内。",
    "**この運用の弱点は修理速度ではなく検知の穴だった、と数字が言っている。**",
    "",
    "推測で埋めない。分からない時刻は書かない（集計は n を明示して出す）。"
  ],
  "seeded": {
    "at": "2026-08-22",
    "coverage": "2026-08-11（運転開始）〜2026-08-22",
    "method": "主系11runはGitHub Actions APIで全数実測。日々の出荷はAUTOPILOT_LOG.mdのエントリとgit logのマージ済みPRを突き合わせて起こした。",
    "known_gaps": [
      "CCR経路の開始時刻が無いため、改善サイクル時間（着手→マージ）はActions経路でしか出せない。",
      "CCR経路の実費は観測手段が無い（スケジュール起動セッションのログは外部から読めない）。cost は null で、0ではない。",
      "1日に2アクション出た回（08-12のC02＝PR #483）は、Runbookが『1セッション1アクション』と定めているため代表1行のみを記録している。"
    ]
  },
  "runs": [
    {
      "run_id": "ap-20260811-manual",
      "date_jst": "2026-08-11",
      "route": "manual",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 470,
      "artifact": "/obsidian/compare/logseq/",
      "source": "autopilot-log+git-log",
      "interventions": [
        {
          "kind": "bootstrap",
          "note": "初回は手動運転で手順を実証（Runbook導入と同時）"
        }
      ],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260812-ccr",
      "date_jst": "2026-08-12",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": "B",
      "action": "refresh",
      "pr": 480,
      "artifact": "/obsidian/compare/logseq/#回答ブロック",
      "source": "autopilot-log+git-log",
      "interventions": [
        {
          "kind": "infra",
          "note": "主系の初回不発を受け、実行基盤をGHA主・CCR副の二重系へ（PR #478）"
        }
      ],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260813-actions",
      "date_jst": "2026-08-13",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "31643630749",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260813-ccr",
      "date_jst": "2026-08-13",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": null,
      "action": "maintenance",
      "pr": 488,
      "source": "autopilot-log+git-log",
      "artifact": null,
      "interventions": [],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260814-actions",
      "date_jst": "2026-08-14",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "31746724152",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260814-ccr",
      "date_jst": "2026-08-14",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": "C",
      "action": "refresh",
      "pr": 501,
      "artifact": "/obsidian/compare/logseq/",
      "source": "autopilot-log+git-log",
      "interventions": [],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260815-actions",
      "date_jst": "2026-08-15",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "31842048839",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260815-ccr",
      "date_jst": "2026-08-15",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": null,
      "action": "maintenance",
      "pr": 502,
      "source": "autopilot-log+git-log",
      "artifact": null,
      "interventions": [],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260816-actions",
      "date_jst": "2026-08-16",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "31909017447",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260816-none",
      "date_jst": "2026-08-16",
      "route": "none",
      "attempted": false,
      "outcome": "no_run",
      "failure_reason": "全経路が不発。副系Routineは当時そもそも存在していなかった（2026-08-20に判明・PR #516）",
      "source": "autopilot-log",
      "interventions": [
        {
          "kind": "infra",
          "note": "2日連続の実行記録ゼロを08-18のセッションが検知。恒久対処として autopilot-health.yml を新設（PR #504）"
        }
      ],
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "external_ref": null,
      "failure_class": "route-absent",
      "failed_at": "2026-08-16T06:00+09:00",
      "detected_at": "2026-08-18T08:43+09:00",
      "resolved_at": "2026-08-19T10:21+09:00",
      "detected_note": "2日連続の実行記録ゼロを08-18のセッションが検知。PR #510 マージが解消時刻"
    },
    {
      "run_id": "ap-20260817-actions",
      "date_jst": "2026-08-17",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "31972997422",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260817-none",
      "date_jst": "2026-08-17",
      "route": "none",
      "attempted": false,
      "outcome": "no_run",
      "failure_reason": "同上",
      "source": "autopilot-log",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": [],
      "external_ref": null,
      "failure_class": "route-absent"
    },
    {
      "run_id": "ap-20260818-actions",
      "date_jst": "2026-08-18",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "32070691341",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260818-ccr",
      "date_jst": "2026-08-18",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": null,
      "action": "maintenance",
      "pr": 505,
      "source": "autopilot-log+git-log",
      "artifact": null,
      "interventions": [],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260819-actions",
      "date_jst": "2026-08-19",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）",
      "external_ref": "32187173035",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260819-actions-manual",
      "date_jst": "2026-08-19",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "failure_reason": "CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY 未設定のためGateで終了（設計どおり静かに寝る）（workflow_dispatch）",
      "external_ref": "32252996254",
      "source": "actions-api",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "interventions": []
    },
    {
      "run_id": "ap-20260819-ccr",
      "date_jst": "2026-08-19",
      "route": "ccr",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 511,
      "artifact": "/obsidian/compare/",
      "source": "autopilot-log+git-log",
      "interventions": [
        {
          "kind": "infra",
          "note": "無記事6日の原因はゲートではなくRunbookのレーンE追記漏れと判明（PR #510）"
        }
      ],
      "failure_reason": null,
      "external_ref": null,
      "repair_of": [
        "ap-20260816-none",
        "ap-20260817-none"
      ]
    },
    {
      "run_id": "ap-20260820-actions",
      "date_jst": "2026-08-20",
      "route": "actions",
      "attempted": true,
      "outcome": "cancelled",
      "failure_reason": "apt がジョブ上限90分を消尽し Claude Code が skipped のまま終了。恒久対処は PR #513",
      "external_ref": "32303452390",
      "source": "actions-api",
      "interventions": [
        {
          "kind": "infra",
          "note": "オーナー指示でフォント導入に時間制限と continue-on-error を入れた（PR #513）"
        }
      ],
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_class": "runner-timeout",
      "failed_at": "2026-08-20T06:21+09:00",
      "detected_at": "2026-08-20T07:00+09:00",
      "resolved_at": "2026-08-20T07:55+09:00",
      "detected_note": "同日のオーナー依頼セッションが検知。PR #513 マージが解消時刻"
    },
    {
      "run_id": "ap-20260820-owner",
      "date_jst": "2026-08-20",
      "route": "owner-session",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 514,
      "artifact": "/obsidian/what-is-vault/",
      "source": "autopilot-log+git-log",
      "interventions": [
        {
          "kind": "substitute",
          "note": "3経路すべて不発のためオーナー依頼セッションが代走"
        }
      ],
      "failure_reason": null,
      "external_ref": null,
      "repair_of": [
        "ap-20260820-actions"
      ]
    },
    {
      "run_id": "ap-20260821-actions",
      "date_jst": "2026-08-21",
      "route": "actions",
      "attempted": true,
      "outcome": "failed",
      "failure_reason": "claude-code-action が非人間アクターを拒否（allowed_bots）。3秒で failure。恒久対処は PR #522/#523",
      "external_ref": "32419185478",
      "source": "actions-api",
      "interventions": [
        {
          "kind": "infra",
          "note": "allowed_bots: '*' を追加（PR #522）"
        }
      ],
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_class": "actor-rejected",
      "failed_at": "2026-08-21T06:23+09:00",
      "detected_at": "2026-08-21T09:20+09:00",
      "resolved_at": "2026-08-21T10:05+09:00",
      "detected_note": "再試行Routine(09:20)が検知。PR #522 マージが解消時刻"
    },
    {
      "run_id": "ap-20260821-ccr0920",
      "date_jst": "2026-08-21",
      "route": "ccr-0920",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 521,
      "artifact": "/obsidian/plugins/",
      "source": "autopilot-log+git-log",
      "interventions": [],
      "failure_reason": null,
      "external_ref": null,
      "repair_of": [
        "ap-20260821-actions"
      ]
    },
    {
      "run_id": "ap-20260822-actions",
      "date_jst": "2026-08-22",
      "route": "actions",
      "attempted": true,
      "outcome": "no_artifact",
      "failure_reason": "conclusion=success だが permission_denials_count=14 で成果物ゼロ（num_turns=30）",
      "external_ref": "32528028588",
      "source": "actions-api",
      "interventions": [
        {
          "kind": "request",
          "note": "obsidian-autopilot.yml の permissions / additional_permissions / claude_args のツール許可リスト確認を依頼（**人は着手せず、AI自身が PR #526 で直した**。起票そのものが誤りだったが、依頼を出した事実は残す）"
        }
      ],
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_class": "permissions",
      "failed_at": "2026-08-22T06:20+09:00",
      "detected_at": "2026-08-22T07:30+09:00",
      "detected_note": "副系CCR(07:30)が get_job_logs で検知。PR #526（14:00 JST マージ）が claude_args に --allowedTools を足して解消。**翌朝 06:18 JST の主系 run 32599191984 が実際に出荷できたことが、その修理が効いた直接証拠**（ap-20260823-actions）",
      "resolved_at": "2026-08-22T14:00+09:00"
    },
    {
      "run_id": "ap-20260822-ccr0730",
      "date_jst": "2026-08-22",
      "route": "ccr-0730",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 524,
      "artifact": "/obsidian/plugins/dataview/",
      "source": "autopilot-log+git-log",
      "interventions": [],
      "failure_reason": null,
      "external_ref": null
    },
    {
      "run_id": "ap-20260823-actions",
      "date_jst": "2026-08-23",
      "route": "actions",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 538,
      "artifact": "/obsidian/pricing/",
      "failure_reason": null,
      "external_ref": "32599191984",
      "interventions": [],
      "repair_of": [
        "ap-20260822-actions"
      ],
      "source": "actions-api+pr",
      "note": "**主系（GitHub Actions）の初出荷。** 2026-08-12 の導入から12回目の schedule 起動で初めて成果物が出た。run 32599191984 は event=schedule / actor=github-actions[bot] / 06:18→06:36 JST（約18分）。過去11回は10〜90秒で終わっており、所要時間そのものが「回ったが何もしていない」との違いを示す。PR #538 は github-actions[bot] が 06:33 JST にマージ（SEO Validation 通過による auto-merge）。**この行は主系自身が書いていない。** #538 の本文は「台帳に resolved_at と repair_of を記録した」と書いているが、13ファイルの diff に data/autopilot-runs.json は含まれていない。出荷したのに台帳が 0/3 のままだったのはこのため"
    },
    {
      "run_id": "ap-20260824-actions",
      "date_jst": "2026-08-24",
      "route": "actions",
      "attempted": true,
      "outcome": "failed",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_class": "auth_or_credential",
      "failed_at": "2026-08-24T06:17+09:00",
      "detected_at": "2026-08-25T08:48+09:00",
      "detected_note": "副系v2フォールバック（本セッション）が obsidian-autopilot.yml の実行履歴を遡って発見。台帳に記録が無かった（成果物ゼロで落ちた回は台帳を書く主体がいない構造的な穴）",
      "failure_reason": "Claude Code ステップが result.is_error=true / num_turns=1 / duration_ms=486 / total_cost_usd=0 で即時失敗。実際の作業（ブランチ作成等）に入る前、初回のモデル呼び出し相当の時点で終わっている。full outputはshow_full_output未設定のためActionsログに出ておらず、正確なエラーメッセージは未特定",
      "external_ref": "32667079679",
      "interventions": [],
      "source": "actions-api",
      "failure_class_original": "auth_or_credential",
      "reclassified_at": "2026-08-25T15:40+09:00",
      "reclassified_note": "【2026-08-26 実測・決着】**原因は資格情報だった。版は容疑から外れる。**疑われていた版（claude-code-action c81e3bc6 が入れる Claude Code 2.1.241）を、**現在の有効なトークンで**直接走らせたところ正常に完走した: is_error=false / num_turns=1 / result=\"PROBE_OK\"（run 32919495397 の suspect-2.1.241・実費 $0.04）。同一プロンプト・同一トークンで回した対照 2.1.245 も同じく完走しており、装置側の誤りではない。つまり 2.1.241 × 旧トークン=失敗、2.1.241 × 新トークン=成功で、**動いている変数はトークンだけ。**さらに上流リポジトリの差分を実測すると c81e3bc6→16b3b310 の src/ の違いは `const claudeCodeVersion = \"2.1.241\" → \"2.1.245\"` の1文字列のみで、ラッパーのロジックは同一。版が失敗を説明できる余地がそもそも無かった。**当初の『auth_or_credential』が正しく、08-25 の『版が原因』という訂正のほうが誤りだった。**誤った理由は『失敗runと成功runでSHAが違う』を版の証拠として読んだこと——@v1 はフローティングタグなので、日をまたげばSHAはほぼ必ず違う。**あの対照は当たり前に差を見つける。** 残る留保: 旧トークンが無効だったことを直接観測したわけではない（旧トークンは既に無く、GitHub Secrets のメタデータは admin 権限が要り 403）。これは消去法による結論。また 08-24/08-25 と 08-26 では時刻も違うため、上流側の一時障害を完全には排除していない（ただし2日とも 486ms で完全同一という決定論的な形は、一時障害より資格情報の拒否と整合する）。 ---- 以下は 08-25 時点の記録（誤った結論を含む。経緯として残す） ---- 当初 auth_or_credential と記録したが誤り。版の実測: 失敗した2回はどちらも claude-code-action@v1 → SHA c81e3bc6（upstream の \"bump Claude Code to 2.1.241 / Agent SDK 0.3.241\"・2026-08-23T00:53Z）を引いていた。直前に出荷できた run 32599191984（08-23）は SHA 24dcd50c / CLI 2.1.240。ジョブログの Download action repository 行で直接確認できる。 秘密鍵は一度も変えていない状態で、同じ秘密鍵を使う run 32816234185（08-25 15:16 JST・SHA 16b3b310 / CLI 2.1.245）が通っている。「2日とも完全同一シグネチャだから flake ではない＝認証系」という推論が誤りで、決定的な startup 失敗も同一の数値を出す——**同一シグネチャは依存が固定されていることの証拠**だった。なお GitHub Secrets のメタデータ読み取りは admin 権限が要り HTTP 403 で読めないため、08-24〜08-25 の間に鍵が回っていなかったことまでは repo からは断定できない（Runbook §7-3 と同じ制約）。 【2026-08-25 訂正】この行は当初「秘密鍵は一度も変えていない」を前提にしていたが、**それは誤り。** 本run(32816234185)を起動したCCRセッションの記録によれば、**オーナーは本runの直前に `claude setup-token` を再実行し CLAUDE_CODE_OAUTH_TOKEN を更新している。** したがって最後の失敗(08-25 06:24)と本runの成功(08-25 15:16)の間で **版とトークンの2つが同時に動いており、どちらが効いたかはこの観測からは分離できない。** 版の相関（2.1.240成功 → 2.1.241で2日連続失敗 → 2.1.245成功）は事実で示唆は強いが、排除ではない。決着させるには、新トークンのまま uses: を c81e3bc6 に固定して1回走らせる（落ちれば版が原因で確定・費用$0）。",
      "resolved_at": "2026-08-25T15:40+09:00",
      "reclassified_confidence": "inconclusive"
    },
    {
      "run_id": "ap-20260825-actions",
      "date_jst": "2026-08-25",
      "route": "actions",
      "attempted": true,
      "outcome": "failed",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_class": "auth_or_credential",
      "failed_at": "2026-08-25T06:24+09:00",
      "detected_at": "2026-08-25T08:48+09:00",
      "detected_note": "副系v2フォールバック（本セッション）が obsidian-autopilot.yml の実行履歴を遡って発見。前日分(ap-20260824-actions)と同時に台帳へ追記",
      "failure_reason": "前日(ap-20260824-actions)と同一シグネチャで2日連続失敗: is_error=true / num_turns=1 / duration_ms=486 / total_cost_usd=0。時間・失敗の形が完全一致しており単発のflakeではない。CLAUDE_CODE_OAUTH_TOKEN/ANTHROPIC_API_KEYいずれかの認証エラーが濃厚だが、full outputが伏せられておりログから断定はできない",
      "external_ref": "32779337325",
      "interventions": [],
      "source": "actions-api",
      "failure_class_original": "auth_or_credential",
      "reclassified_at": "2026-08-25T15:40+09:00",
      "reclassified_note": "【2026-08-26 実測・決着】**原因は資格情報だった。版は容疑から外れる。**疑われていた版（claude-code-action c81e3bc6 が入れる Claude Code 2.1.241）を、**現在の有効なトークンで**直接走らせたところ正常に完走した: is_error=false / num_turns=1 / result=\"PROBE_OK\"（run 32919495397 の suspect-2.1.241・実費 $0.04）。同一プロンプト・同一トークンで回した対照 2.1.245 も同じく完走しており、装置側の誤りではない。つまり 2.1.241 × 旧トークン=失敗、2.1.241 × 新トークン=成功で、**動いている変数はトークンだけ。**さらに上流リポジトリの差分を実測すると c81e3bc6→16b3b310 の src/ の違いは `const claudeCodeVersion = \"2.1.241\" → \"2.1.245\"` の1文字列のみで、ラッパーのロジックは同一。版が失敗を説明できる余地がそもそも無かった。**当初の『auth_or_credential』が正しく、08-25 の『版が原因』という訂正のほうが誤りだった。**誤った理由は『失敗runと成功runでSHAが違う』を版の証拠として読んだこと——@v1 はフローティングタグなので、日をまたげばSHAはほぼ必ず違う。**あの対照は当たり前に差を見つける。** 残る留保: 旧トークンが無効だったことを直接観測したわけではない（旧トークンは既に無く、GitHub Secrets のメタデータは admin 権限が要り 403）。これは消去法による結論。また 08-24/08-25 と 08-26 では時刻も違うため、上流側の一時障害を完全には排除していない（ただし2日とも 486ms で完全同一という決定論的な形は、一時障害より資格情報の拒否と整合する）。 ---- 以下は 08-25 時点の記録（誤った結論を含む。経緯として残す） ---- 当初 auth_or_credential と記録したが誤り。版の実測: 失敗した2回はどちらも claude-code-action@v1 → SHA c81e3bc6（upstream の \"bump Claude Code to 2.1.241 / Agent SDK 0.3.241\"・2026-08-23T00:53Z）を引いていた。直前に出荷できた run 32599191984（08-23）は SHA 24dcd50c / CLI 2.1.240。ジョブログの Download action repository 行で直接確認できる。 秘密鍵は一度も変えていない状態で、同じ秘密鍵を使う run 32816234185（08-25 15:16 JST・SHA 16b3b310 / CLI 2.1.245）が通っている。「2日とも完全同一シグネチャだから flake ではない＝認証系」という推論が誤りで、決定的な startup 失敗も同一の数値を出す——**同一シグネチャは依存が固定されていることの証拠**だった。なお GitHub Secrets のメタデータ読み取りは admin 権限が要り HTTP 403 で読めないため、08-24〜08-25 の間に鍵が回っていなかったことまでは repo からは断定できない（Runbook §7-3 と同じ制約）。 【2026-08-25 訂正】この行は当初「秘密鍵は一度も変えていない」を前提にしていたが、**それは誤り。** 本run(32816234185)を起動したCCRセッションの記録によれば、**オーナーは本runの直前に `claude setup-token` を再実行し CLAUDE_CODE_OAUTH_TOKEN を更新している。** したがって最後の失敗(08-25 06:24)と本runの成功(08-25 15:16)の間で **版とトークンの2つが同時に動いており、どちらが効いたかはこの観測からは分離できない。** 版の相関（2.1.240成功 → 2.1.241で2日連続失敗 → 2.1.245成功）は事実で示唆は強いが、排除ではない。決着させるには、新トークンのまま uses: を c81e3bc6 に固定して1回走らせる（落ちれば版が原因で確定・費用$0）。",
      "resolved_at": "2026-08-25T15:40+09:00",
      "reclassified_confidence": "inconclusive"
    },
    {
      "run_id": "ap-20260825-actions-force",
      "date_jst": "2026-08-25",
      "route": "actions",
      "attempted": true,
      "outcome": "shipped",
      "lane": "F",
      "action": "maintenance",
      "pr": 568,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "32816234185",
      "interventions": [],
      "source": "session",
      "repair_of": [
        "ap-20260824-actions",
        "ap-20260825-actions"
      ],
      "note": "**主系の手動force実行（workflow_dispatch・triggering_actor=simplememofast）。** 同日の schedule run(ap-20260825-actions)が即時失敗した後の再走なので、run_id は route だけでは一意にならず -force を付けている。レーンFで1日を使い、記事は書いていない。修理の内容は claude-code-action を SHA 16b3b310（この run が実際に通した版）へpin したこと。**上流の壊れた版そのものは直せないが、勝手に乗り換える構造は直せる**——ここを固定しない限り、次の版が壊れていれば同じ2日が繰り返される。"
    },
    {
      "run_id": "ap-20260825-ccrfallback",
      "date_jst": "2026-08-25",
      "route": "ccr-fallback-v2",
      "attempted": true,
      "outcome": "shipped",
      "lane": null,
      "action": "maintenance",
      "pr": 548,
      "artifact": "data/autopilot-status.json,docs/obsidian/AUTOPILOT_LOG.md,.github/workflows/obsidian-autopilot.yml,data/autopilot-runs.json",
      "failure_reason": null,
      "external_ref": null,
      "interventions": [],
      "source": "session",
      "$recovered": "**[2026-08-28] 取り残しブランチからの復旧。**この行は当時のセッションが claude/obsidian-auto-20260825 に書いたが、PR #548 のマージ後だったため main に入らなかった（auto-merge は検証済みSHAだけをマージする設計の帰結）。2026-08-28 に取り残し5件を読み直したとき、内容が別経路で着地していない唯一の行だったので拾い上げた。\n\n**AI完走率が 76.2% → 77.3% に上がる追記なので、オーナーの明示の許可を得てから入れた。**数字が有利な方向に動く追記を拾った側の一存で入れない、という原則のため。\n\n元の記録は lane が文字列 \"null\" だった（値としては無意味なので、本来の null にした）。それ以外は当時の記録のまま。"
    },
    {
      "run_id": "ap-20260826-actions",
      "date_jst": "2026-08-26",
      "route": "actions",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 586,
      "artifact": "/obsidian/sync/",
      "failure_reason": null,
      "external_ref": "32900786201",
      "interventions": [],
      "source": "session"
    },
    {
      "run_id": "ap-20260827-actions",
      "date_jst": "2026-08-27",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "33026752472",
      "interventions": [],
      "source": "act-reconcile",
      "detected_at": "2026-08-31T23:39:57.061Z"
    },
    {
      "run_id": "ap-20260827-ccr0920",
      "date_jst": "2026-08-27",
      "route": "ccr-0920",
      "attempted": true,
      "outcome": "shipped",
      "lane": "C",
      "action": "refresh",
      "pr": 660,
      "artifact": "/obsidian/plugins/",
      "failure_reason": null,
      "external_ref": null,
      "interventions": [],
      "source": "session"
    },
    {
      "run_id": "ap-20260827-owner-session",
      "date_jst": "2026-08-27",
      "route": "owner-session",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 668,
      "artifact": "/obsidian/sync/icloud/",
      "failure_reason": null,
      "external_ref": null,
      "interventions": [],
      "source": "session"
    },
    {
      "run_id": "ap-20260828-actions",
      "date_jst": "2026-08-28",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "33143661940",
      "interventions": [],
      "source": "act-reconcile",
      "detected_at": "2026-08-31T23:39:56.990Z"
    },
    {
      "run_id": "ap-20260828-ccr0920",
      "date_jst": "2026-08-28",
      "route": "ccr-0920",
      "attempted": true,
      "outcome": "shipped",
      "lane": "E",
      "action": "new",
      "pr": 696,
      "artifact": "/obsidian/sync/official-sync/",
      "failure_reason": null,
      "external_ref": null,
      "interventions": [],
      "source": "session"
    },
    {
      "run_id": "ap-20260829-actions",
      "date_jst": "2026-08-29",
      "route": "actions",
      "attempted": false,
      "outcome": "skipped_gate",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "33230445898",
      "interventions": [],
      "source": "act-reconcile-session",
      "detected_at": "2026-08-31T23:27:34Z",
      "detected_note": "Actions API のステップ一覧から起こした。Gate は success だが Checkout 以降が全て skipped ＝ Gate が run=false を出した回（秘密鍵未設定・当日重複のいずれか。ステップの conclusion からはどちらかまでは決まらない）。"
    },
    {
      "run_id": "ap-20260829-ccr0920",
      "date_jst": "2026-08-29",
      "route": "ccr-0920",
      "attempted": true,
      "outcome": "no_artifact",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": "副系が当日ロック（claude/obsidian-auto-20260829）を claim だけ取って、記事もPRも作らずに終わった。**同じ日の主系（ap-20260829-actions・skipped_gate）が何もしなかったのは、これが理由。**Gate はブランチの存在を『進行中/実行済み』と読んでスキップし、3秒で success を返す。**claim を取った側が死ぬと、その日は主系も走らないまま緑になる。**主系側の行だけを見ると『重複でスキップした正常な日』に見えるので、この行を別に立てている",
      "external_ref": null,
      "interventions": [],
      "source": "git: claude/obsidian-auto-20260829 は claim コミット1件のみ（36de90a6・lane: ccr-0920）で main との差分ゼロ。PRは存在しない。主系 run 33230445898 は steps 3〜13 が全て skipped で3秒 success",
      "failure_class": "claim_without_completion",
      "failed_at": "2026-08-29T09:20+09:00",
      "detected_at": "2026-09-01T08:10+09:00"
    },
    {
      "run_id": "ap-20260830-actions",
      "date_jst": "2026-08-30",
      "route": "actions",
      "attempted": true,
      "outcome": "failed",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": "Claude Code ステップが失敗し、同じトークンでの単独実行も HTTP 429（使用量上限）を返した: \"You've hit your weekly limit · resets Aug 31, 11pm (UTC)\"。**資格情報は失効していない** —— トークンを入れ替えても直らないし、入れ替えれば無事な鍵を捨てることになる。上限がリセットされれば自動で戻る。副系CCRも同じアカウントなので同じ時間帯に同じ形で落ちる。【この行の但し書き】2026-09-01 のセッションが Actions API とジョブログから起こした。当時のワークフローの切り分けステップと interpretRun は2値しか持たず、429 を「資格情報が通っていない。claude setup-token を再実行せよ」と needs_triage なしで書く形だったため、**その誤った断定は台帳に入れていない**（同じPRで両方を直した）。",
      "external_ref": "33279844326",
      "interventions": [],
      "source": "act-reconcile-session",
      "failure_class": "usage_limit",
      "detected_at": "2026-08-31T23:27:44Z"
    },
    {
      "run_id": "ap-20260831-actions",
      "date_jst": "2026-08-31",
      "route": "actions",
      "attempted": true,
      "outcome": "failed",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": "Claude Code ステップが失敗し、同じトークンでの単独実行も HTTP 429（使用量上限）を返した: \"You've hit your weekly limit · resets 11pm (UTC)\"。**資格情報は失効していない** —— トークンを入れ替えても直らないし、入れ替えれば無事な鍵を捨てることになる。上限がリセットされれば自動で戻る。副系CCRも同じアカウントなので同じ時間帯に同じ形で落ちる。【この行の但し書き】2026-09-01 のセッションが Actions API とジョブログから起こした。当時のワークフローの切り分けステップと interpretRun は2値しか持たず、429 を「資格情報が通っていない。claude setup-token を再実行せよ」と needs_triage なしで書く形だったため、**その誤った断定は台帳に入れていない**（同じPRで両方を直した）。",
      "external_ref": "33340960317",
      "interventions": [],
      "source": "act-reconcile-session",
      "failure_class": "usage_limit",
      "detected_at": "2026-08-31T23:27:44Z"
    },
    {
      "run_id": "ap-20260831-ccr0920",
      "date_jst": "2026-08-31",
      "route": "ccr-0920",
      "attempted": true,
      "outcome": "failed",
      "lane": null,
      "action": null,
      "pr": null,
      "artifact": null,
      "failure_reason": "実行枠（週次）の上限。Routine `trig_01ESF9AHax6buS9X1pdFv657`（09:20 JST・ccr-0920）の起動が 13 秒で FAILED（fired 2026-08-31T00:20:33Z / finished 00:20:46Z / session cse_01VZpZ4oseTMEgbBPzddUSxN）。同セッションの rate_limit_info が `seven_day` / `rejected` / resetsAt 2026-08-31T23:00:00Z を返している。**主系の 429 と同じ事象の副系側**で、同じアカウントなので代走にならなかった。1ターンも回っていないため当日ブランチの占有も無い（claude/obsidian-auto-20260831 は存在しない）",
      "external_ref": "cse_01VZpZ4oseTMEgbBPzddUSxN",
      "interventions": [],
      "source": "act-reconcile-session",
      "failure_class": "usage_limit",
      "failed_at": "2026-08-31T00:20:46Z",
      "detected_at": "2026-09-01T00:14:46Z",
      "detected_note": "list_triggers の last_run を実見（PR #739 のセッション）。**last_run は最新1回しか保持しない**ので、08-30 の同経路は既に上書きされていて確かめられない"
    },
    {
      "run_id": "ap-20260901-actions",
      "date_jst": "2026-09-01",
      "route": "actions",
      "attempted": true,
      "outcome": "shipped",
      "lane": "F",
      "action": "maintenance",
      "pr": 749,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "33454414490",
      "interventions": [],
      "source": "session",
      "repair_note": "主系（Actions・run 33454414490・09:21→09:39 JST）がレーンFで PR #749「§0-3 の経路を限る」を出荷した回。**この行は 2026-09-02 の配信前日の引き直しで人が起こした。**AUTOPILOT_LOG 09-02 分が「09:00 の reconcile-runs が埋める見込み」と書いて手で足さなかったが、reconcile-runs は成功回を自動追記しない（PR 番号の特定が要るため。scripts/autopilot-act.mjs の handler に明記）ので、待っても埋まらなかった。**artifact は null** —— 公開ページを出していない回（レーンFの慣例）。同日の副系 ccr-0920 は 00:20:49Z に SUCCEEDED したが主系が当日ロックを先に取っていたためスキップ（70秒・$0.42、#749 の本文に記録）。"
    },
    {
      "run_id": "ap-20260902-actions",
      "date_jst": "2026-09-02",
      "route": "actions",
      "attempted": true,
      "outcome": "shipped",
      "lane": "F",
      "action": "maintenance",
      "pr": 774,
      "artifact": null,
      "failure_reason": null,
      "external_ref": "33568838189",
      "interventions": [],
      "source": "session",
      "repair_of": [
        "ap-20260829-ccr0920"
      ],
      "repair_note": "触ったのは scripts/autopilot-gate.mjs（isAbandonedClaim と run_takeover）/ scripts/autopilot-selfheal.mjs（owner_routed）/ scripts/autopilot-drill.mjs / scripts/property-tests.mjs / docs/obsidian/AUTOPILOT_RUNBOOK.md。**artifact は null** —— 公開ページを出していない回なので（レーンFの慣例。ap-20260825-actions-force と同じ）。\n\n**部分的な修理であることを明記する。**判定（isAbandonedClaim）・Runbook §0-2 の引き継ぎ手順・ドリル4件・性質2件は main へ入るので、Runbook を読む経路（副系CCR・代走）には本日から効く。**主系の bash Gate はまだ旧判定のまま** —— .github/workflows/obsidian-autopilot.yml への push を GitHub が拒否した（fine-grained PAT に workflow スコープが無い）。これは 2026-08-25 の決定どおりの動作で（act-gh-pat-scope-and-rotation: 足すと無人の主系が自分の permissions を書き換えられるため足さない／ワークフローの修理は副系CCRが引き取る）、パッチは AUTOPILOT_LOG.md 本日分に貼って引き継いだ。"
    }
  ]
}
