Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions docs/bugfix-batch-plan.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 不具合修正バックログ消化計画 — 第 2 バッチ

> **状態**: 第 1 バッチ (PR A〜L、12 本) はすべてマージ済み。**第 2 バッチは優先枠 PR T〜W (4 本) + 通常枠 PR M〜S (7 本) の計 11 本。うち PR T がマージ済み、PR V が実装済み (未マージ)、残り 9 本は未着手**。加えて第 1 バッチの実走観測が 2 件残っている。**優先枠を先に消化する** (→ [§ 優先枠](#優先枠-pr-tw--他の不具合の発見を遅らせる層))。
> **状態**: 第 1 バッチ (PR A〜L、12 本) はすべてマージ済み。**第 2 バッチは優先枠 PR T〜W (4 本) + 通常枠 PR M〜S (7 本) の計 11 本。うち PR T / V がマージ済み、PR W が実装済み (未マージ)、残り 8 本は未着手**。加えて第 1 バッチの実走観測が 2 件残っている。**優先枠を先に消化する** (→ [§ 優先枠](#優先枠-pr-tw--他の不具合の発見を遅らせる層))。
>
> **本ファイルは ephemeral な作業計画書**である。第 2 バッチのマージと後始末が済み、下記の観測も済んだら**本ファイル自身を削除する** (→ [§ 退役手順](#退役手順))。
>
Expand All @@ -18,7 +18,7 @@

**選定の経緯**: [todo-summary.md](todo-summary.md) / [todo-summary2.md](todo-summary2.md) の全 255 行から台帳掲載の 34 順位を機械的に除外し、**第 1 バッチ作成 (2026-08-17) 以降に起票された分**を対象に選別した (それ以前の順位は第 1 バッチ作成時に一度選別済みのため再検討しない)。対象は順位 468 / 470-485 の **17 件** + [todo25.md](todo25.md) の未採番 5 件。

**進行表の順位には 2 つの出所がある。** 上記の選別を通ったのは 6 件 (468 / 476 / 477 / 481 / 484 + 未採番 1 件 = 順位 492) で、残りは**本計画の作業中に新規起票したもの**である — 順位 486 / 487 は 2026-08-23 の夜間ループ停止調査から ([PR #440](https://github.com/aloekun/claude-code-hook-test/pull/440))、順位 488-491 は同調査中に判明した観測性・誤警告から ([PR #443](https://github.com/aloekun/claude-code-hook-test/pull/443)) 起票した。選別対象の集合に含まれないのは、**起票時点で存在しなかった**ためである。このうち予防 lint (470 / 474 / 482 / 483)、テスト追加 (471 / 478 / 485)、doc・再評価 (472 / 473 / 479)、docs サイズ是正 2 件は基準 (2) を満たさないため除外した。境界線上の 480 (観測性の改善) と 475 (発現経路が未確認) も今回は見送る。
**進行表の順位には 2 つの出所がある。** 上記の選別を通ったのは 6 件 (468 / 476 / 477 / 481 / 484 + 未採番 1 件 = 順位 493) で、残りは**本計画の作業中に新規起票したもの**である — 順位 486 / 487 は 2026-08-23 の夜間ループ停止調査から ([PR #440](https://github.com/aloekun/claude-code-hook-test/pull/440))、順位 488-491 は同調査中に判明した観測性・誤警告から ([PR #443](https://github.com/aloekun/claude-code-hook-test/pull/443)) 起票した。選別対象の集合に含まれないのは、**起票時点で存在しなかった**ためである。このうち予防 lint (470 / 474 / 482 / 483)、テスト追加 (471 / 478 / 485)、doc・再評価 (472 / 473 / 479)、docs サイズ是正 2 件は基準 (2) を満たさないため除外した。境界線上の 480 (観測性の改善) と 475 (発現経路が未確認) も今回は見送る。

### 優先枠 (PR T〜W) — 他の不具合の発見を遅らせる層

Expand All @@ -39,8 +39,8 @@
| # | PR | 対象順位 | 状態 |
|---|---|---|---|
| T | `fix(nightly-todo): 着手して失敗した夜を red にする` | 488 | **マージ済み ([#445](https://github.com/aloekun/claude-code-hook-test/pull/445))** — 実走確認のみ残 |
| V | `fix(pr-monitor): takt 前後の比較で作業ツリー変更を判定する` | 490 | **実装済み (未マージ)** |
| W | `test(ledger): 台帳の実体整合を cargo test で検査する` | 491 | 未着手 |
| V | `fix(pr-monitor): takt 前後の比較で作業ツリー変更を判定する` | 490 | **マージ済み ([#446](https://github.com/aloekun/claude-code-hook-test/pull/446))** |
| W | `test(ledger): 台帳の実体整合を cargo test で検査する` | 491 | **実装済み (未マージ)** |
| U | `fix(jj-op-verify): 付随 op を読み飛ばして照合する` | 489 | 未着手 |

優先枠内の消化順は **T → V → W → U**。T を先頭に置くのは、これが無いと以降の PR で夜間ループが
Expand Down Expand Up @@ -95,7 +95,20 @@

**通常枠 PR R (順位 486) と同じ層** — 統合または実装順の調整を着手時に判断する。

**後始末**: todo26.md の 491 節 + todo-summary2.md の 491 行を削除。
**2026-08-25 の判断: 統合しない。** 3 検査を実測で並べたところ、共有するのは*置き場所*
(`deployed_ledger.rs`) と*走行タイミング* (毎 `cargo test`) だけで、判定ロジックは重ならない
(486 = 宣言パス × deny リスト / 491-A = 順位集合の矛盾 / 491-B = 宣言パス × 実ファイルの中身)。
486 と 491-B が共有する「対象ファイル欄 → パス抽出」は `parse_target_files` として実装済みなので
同時にやる利得が無く、486 には未解決の前提 (deny リストの単一定義先 = 順位 454) がある。
**PR R は通常枠の順番のまま**。

**実装済み (2026-08-25)**: 検査 A / B を `deployed_ledger.rs` に追加。**判定規則は
「宣言先に無く、リポジトリの他所には在る」= 漂流**とした — 台帳は未着手の作業を書く場所なので
「これから作る識別子」と「漂流した既存識別子」を構文では分けられず、素朴な実装は 30 行中
12 行が偽陽性になった (2026-08-25 実測)。この規則 + バッククォートを Rust 識別子に限定で 1 件まで
落ち、残る順位 281 は注意欄の `照合除外:` マーカー (理由必須) で除外した。

**後始末**: todo26.md の 491 節 + todo-summary2.md の 491 行を削除 — **実施済み (2026-08-25)**。

#### PR U — 付随 op を読み飛ばして照合する (順位 489)

Expand All @@ -117,7 +130,7 @@
| Q | `fix(merge-pipeline): takt run の終了理由を記録する` | 468 | 未着手 |
| N | `fix(subprocess): 正常終了経路の join を上限付きにする` | 481 | 未着手 |
| M | `fix(hooks): 判定層の誤検知と見逃しを塞ぐ` | 476 + 477 | 未着手 |
| P | `fix(mtime): jj materialize で壊れる mtime 依存判定を是正する` | 492 (新規採番) | 未着手 |
| P | `fix(mtime): jj materialize で壊れる mtime 依存判定を是正する` | 493 (新規採番) | 未着手 |
| O | `fix(push-runner): bookmark_check の非空不変条件を seal する` | 484 | 未着手 |
| R | `feat(ledger): auto lane の対象ファイルが Guard 禁止パスに当たる行を弾く` | 486 | 未着手 |
| S | `fix(nightly-todo): master 参照を SHA で pin する` | 487 | 未着手 |
Expand Down Expand Up @@ -169,7 +182,7 @@

**後始末**: todo24.md の 476 / 477 節 + todo-summary2.md の 476 / 477 行を削除。あわせて台帳から 283 の行を削除する (476 へ統合するため)。

#### PR P — jj materialize で壊れる mtime 依存判定を是正する (順位 492、新規採番)
#### PR P — jj materialize で壊れる mtime 依存判定を是正する (順位 493、新規採番)

**束ねた理由**: crate は別だが、**根因が「jj が working copy を materialize すると全ファイルの mtime が checkout 時刻へ書き換わる」の 1 つ**である。[todo25.md](todo25.md) のエントリ自身が「2 件は同一の根因クラスなので 1 タスクとして扱う」と宣言している。片方だけ直すと同じ罠がもう片方に残る。

Expand All @@ -179,7 +192,7 @@

**前提**: 順位の採番が要る → [§ 着手前に片付ける 3 件](#着手前に片付ける-3-件)。

**後始末**: todo25.md の該当節 + todo-summary2.md の 492 行を削除。
**後始末**: todo25.md の該当節 + todo-summary2.md の 493 行を削除。

#### PR O — bookmark_check の非空不変条件を seal する (順位 484)

Expand Down Expand Up @@ -223,7 +236,7 @@
1 と 2 は該当 PR に同乗させる (単独の docs PR は立てない)。3 は即時の運用対処で、PR を待たない。

1. **順位 283 を auto lane から引き取る (`✅` → `—`)** — **PR M の前提**。順位 476 は台帳の順位 283 (`fix(jj-op-verify): verb 検出をコマンド境界に anchor する`) と同一内容で、`✅` のままだと夜間ループが同じファイルを並行実装する (順位 474 がまさに検知しようとしている競合)。476 側に実観測 4 回と quote-aware の具体的な設計案があるので、**283 を取り下げて 476 へ統合**し、台帳の lane 操作を PR M に含める。着手前に `claude/nightly-283` ブランチが存在しないことも確認する。
2. **todo25.md の未採番 5 件を順位 492-496 として起票** — **PR P の前提**。todo25.md は詳細エントリ 10 節に対し summary 行が 481-485 の 5 行しかなく、週次レビュー採用 3 件と docs サイズ是正 2 件が [ADR-033](adr/adr-033-todo-numbering-simplification.md) の言う「絶対番号は table のみに保持」を満たしていない。PR P が対象順位を書けないので、**5 件まとめての採番を PR P に同乗**させる (1 件だけ採番すると 1:1 対応のずれが残るため)。なお、このずれは順位 441「詳細エントリ ⇄ 台帳行の 1:1 対応検査」が検出すべきものである。
2. **todo25.md の未採番 5 件を順位 493-497 として起票** — **PR P の前提**。todo25.md は詳細エントリ 10 節に対し summary 行が 481-485 の 5 行しかなく、週次レビュー採用 3 件と docs サイズ是正 2 件が [ADR-033](adr/adr-033-todo-numbering-simplification.md) の言う「絶対番号は table のみに保持」を満たしていない。PR P が対象順位を書けないので、**5 件まとめての採番を PR P に同乗**させる (1 件だけ採番すると 1:1 対応のずれが残るため)。なお、このずれは順位 441「詳細エントリ ⇄ 台帳行の 1:1 対応検査」が検出すべきものである。
3. **台帳の lane 引き取りと handoff marker の後始末** — **即時の運用対処** (PR R の前提でもある)。夜間ループは毎晩 agent を 1 回まるごと走らせて最後に落ちる状態なので、PR を待たずに台帳を直す。
- 順位 **383 / 454 / 368 / 360 / 361** の `無人可` を `✅` → `—` へ変更する (5 件とも成果物が Guard 禁止パス配下で、auto lane では完了不能)
- `claude/nightly-383` (2026-08-20 の handoff marker、`bf206535` を指す空 ref) を削除する
Expand Down
Loading
Loading