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
8 changes: 4 additions & 4 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 / V / W がマージ済み、PR U が実装済み (未マージ)、残り 7 本は未着手**。加えて第 1 バッチの実走観測が 2 件残っている。**優先枠を先に消化する** (→ [§ 優先枠](#優先枠-pr-tw--他の不具合の発見を遅らせる層))。
> **状態**: 第 1 バッチ (PR A〜L、12 本) はすべてマージ済み。**第 2 バッチは優先枠 PR T〜W (4 本) + 通常枠 PR M〜S (7 本) の計 11 本。うち優先枠 PR T〜W (4 本) はすべてマージ済み、通常枠 PR M〜S (7 本) は未着手**。加えて第 1 バッチの実走観測が 2 件残っている。**優先枠を先に消化する** (→ [§ 優先枠](#優先枠-pr-tw--他の不具合の発見を遅らせる層))。
>
> **本ファイルは ephemeral な作業計画書**である。第 2 バッチのマージと後始末が済み、下記の観測も済んだら**本ファイル自身を削除する** (→ [§ 退役手順](#退役手順))。
>
Expand Down Expand Up @@ -41,7 +41,7 @@
| T | `fix(nightly-todo): 着手して失敗した夜を red にする` | 488 | **マージ済み ([#445](https://github.com/aloekun/claude-code-hook-test/pull/445))** — 実走確認のみ残 |
| V | `fix(pr-monitor): takt 前後の比較で作業ツリー変更を判定する` | 490 | **マージ済み ([#446](https://github.com/aloekun/claude-code-hook-test/pull/446))** |
| W | `test(ledger): 台帳の実体整合を cargo test で検査する` | 491 | **マージ済み ([#447](https://github.com/aloekun/claude-code-hook-test/pull/447))** |
| U | `fix(jj-op-verify): 付随 op を読み飛ばして照合する` | 489 | **実装済み (未マージ)** |
| U | `fix(jj-op-verify): 付随 op を読み飛ばして照合する` | 489 | **マージ済み ([#448](https://github.com/aloekun/claude-code-hook-test/pull/448))** |

優先枠内の消化順は **T → V → W → U**。T を先頭に置くのは、これが無いと以降の PR で夜間ループが
壊れても気づけないため。U を最後にするのは Tier 2 で、かつ通常枠 PR M (順位 476) と
Expand Down Expand Up @@ -150,7 +150,7 @@ PR M の前提だが、283 は 476 と同一内容で auto lane に残すと夜
| Q | `fix(merge-pipeline): takt run の終了理由を記録する` | 468 | 未着手 |
| N | `fix(subprocess): 正常終了経路の join を上限付きにする` | 481 | 未着手 |
| M | `fix(hooks): 判定層の誤検知と見逃しを塞ぐ` | 476 + 477 | 未着手 |
| P | `fix(mtime): jj materialize で壊れる mtime 依存判定を是正する` | 493 (新規採番) | 未着手 |
| P | `fix(mtime): jj materialize で壊れる mtime 依存判定を是正する` | 493 | 未着手 (採番は 2026-08-26 に実施済み) |
| 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 @@ -256,7 +256,7 @@ PR M の前提だが、283 は 476 と同一内容で auto lane に残すと夜
1 と 2 は該当 PR に同乗させる (単独の docs PR は立てない)。3 は即時の運用対処で、PR を待たない。

1. **順位 283 を auto lane から引き取る (`✅` → `—`)** — **PR M の前提 — lane 変更は PR U (#448 予定) で実施済み (2026-08-25)**。残るのは台帳行そのものの削除で、これは 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 件を順位 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 対応検査」が検出すべきものである。
2. **todo25.md の未採番 5 件を順位 493-497 として起票** — **PR P の前提。2026-08-26 に実施済み** (defect-convergence-plan.md § Phase D の D3 に同乗)。以下は起票時の記録である。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
26 changes: 19 additions & 7 deletions docs/defect-convergence-plan.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 不具合収束計画 — 後追い発覚ループの根治

> **状態**: Phase 0 は完了 (PR T・V・W・U = マージ済み。実走確認 1 件のみ残)。**Phase D 進行中 (D1 = マージ済み / D2 = 実装済み・未マージ / D3 = 未着手)**、Phase 1 以降は未着手。**PR 総数は新規 10 本 (機構 4 + ルール撤廃 3 + 台帳 drift 3)**。既存の第 2 バッチ 11 本 ([bugfix-batch-plan.md](bugfix-batch-plan.md)) と交錯して進める (→ [§ 全体順序](#全体順序))。
> **状態**: Phase 0 は完了 (PR T・V・W・U = マージ済み。実走確認 1 件のみ残)。**Phase D 進行中 (D1・D2 = マージ済み / D3 = 実装済み・未マージ)**、Phase 1 以降は未着手。**PR 総数は新規 10 本 (機構 4 + ルール撤廃 3 + 台帳 drift 3)**。既存の第 2 バッチ 11 本 ([bugfix-batch-plan.md](bugfix-batch-plan.md)) と交錯して進める (→ [§ 全体順序](#全体順序))。
>
> **本ファイルは ephemeral な作業計画書**であり、**本ファイルと参照先の repo 内ドキュメントだけで作業に着手できる**ことを編集方針とする (実装セッションは本計画の策定会話を参照できない)。退役条件は [§ 退役手順](#退役手順)。
>
Expand All @@ -11,8 +11,8 @@
| # | PR | Phase | 状態 |
|---|---|---|---|
| D1 | `fix(nightly-todo): 台帳削除の失敗も handoff marker の対象にする` | D | **マージ済み ([#449](https://github.com/aloekun/claude-code-hook-test/pull/449))** |
| D2 | `feat(ledger): 詳細エントリに順位を付与し結合キーを移す` | D | **実装済み (未マージ)** |
| D3 | `feat(docs-lint): 順位 ⇄ 詳細エントリの 1:1 対応検査 (順位 441 の実装)` | D | 未着手 |
| D2 | `feat(ledger): 詳細エントリに順位を付与し結合キーを移す` | D | **マージ済み ([#450](https://github.com/aloekun/claude-code-hook-test/pull/450))** |
| D3 | `feat(docs-lint): 順位 ⇄ 詳細エントリの 1:1 対応検査 (順位 441 の実装)` | D | **実装済み (未マージ)** |
| 機1 | `feat(push-runner): testability gate — I/O 癒着判定の混入を止める` | 1 | 未着手 |
| 機2 | `feat(push-runner): open-questions gate — 未解決の問いが push を止める` | 2 | 未着手 |
| 機3 | `fix(nightly-todo): 掃除ループの判定を exe へ移す` | 3 | 未着手 |
Expand Down Expand Up @@ -88,9 +88,9 @@

## Phase D — 台帳 drift の根治 (新規 3 本)

**進捗 (2026-08-26)**: **D1 = マージ済み ([#449](https://github.com/aloekun/claude-code-hook-test/pull/449))**、**D2 = 実装済み (未マージ)**、D3 = 未着手。
**進捗 (2026-08-26)**: **D1 ([#449](https://github.com/aloekun/claude-code-hook-test/pull/449)) / D2 ([#450](https://github.com/aloekun/claude-code-hook-test/pull/450)) = マージ済み**、**D3 = 実装済み (未マージ)**。

**D2 の移送結果**: 移行対象は「**順位 table に行を持つ詳細エントリ**」257 件 (`todoN.md` の `### ` 見出しは全 276 件で、順位 table に行が無い 53 件は対象外)。対象 257 件すべてへ `### 順位 N: <タイトル>` を付与し、`remove_detail_entry` を順位照合へ差し替えた。段 4 は当初 34 件だったが、todo21 / todo22 の 26 件が「summary は `(系統 A-1)` 末尾 / 見出しは `系統 A-1:` 前置」という**系統的なリネーム**と判明し規則で解決できたため、手動確定は **8 件**で済んだ (2026-08-26 ユーザー承認)。実測で **257 件すべてが順位で一意に引ける**ことを確認済み。移送スクリプトは使い捨てとし残していない。
**D2 の移送結果**: 移行対象は「**順位 table に行を持つ詳細エントリ**」257 件 (`todoN.md` の `### ` 見出しは全 276 件で、順位 table に行が無い 19 件は対象外。D3 で分類し、うち 5 件は採番漏れとして順位 493-497 を採番した)。対象 257 件すべてへ `### 順位 N: <タイトル>` を付与し、`remove_detail_entry` を順位照合へ差し替えた。段 4 は当初 34 件だったが、todo21 / todo22 の 26 件が「summary は `(系統 A-1)` 末尾 / 見出しは `系統 A-1:` 前置」という**系統的なリネーム**と判明し規則で解決できたため、手動確定は **8 件**で済んだ (2026-08-26 ユーザー承認)。実測で **257 件すべてが順位で一意に引ける**ことを確認済み。移送スクリプトは使い捨てとし残していない。

**何を止めるか**: 詳細エントリの結合キーが自由記述のタイトル文字列であるために、夜間ループの後始末が hard-fail し、失敗しても marker が残らず同じ順位が毎晩再選択される状態。

Expand Down Expand Up @@ -167,18 +167,30 @@ summary の「タスク」列に `★ Bundle 195-FB follow-up` が付き、todo1
1. 全 276 件の見出しへ順位を付与する。段 1〜3 の 223 件は移送スクリプトで機械的に付与し、**対応表を PR に添付する**
2. `remove_detail_entry` を順位で照合する形へ差し替える (タイトルは表示用へ降格)
3. **段 4 の 34 件は着手時に一覧を出してユーザー判断を仰ぐ** — 実体は (a) 見出しが大きく書き換わった (b) 詳細エントリが消えている、のどちらか
4. **対応の付かない見出し 53 件は触らない** — 順位が無いので後始末の対象にならず実害が無い。D3 の検査で可視化される
4. **順位 table に行を持たない見出しは触らない** — 順位が無いので後始末の対象にならず実害が無い。D3 で分類する (実測 19 件)
5. **ADR-033 の改訂を同乗**させる。決定 1 を「**機械が読む結合キーは順位、人間が読む参照はタスク名**」へ改め、当時の前提 (後始末は人手) が PR #406 の機械化で変わった経緯を記録する

**完了基準**: `cli-ledger-cleanup` が順位だけで詳細エントリを特定できること。**タイトルを書き換えても後始末が壊れない**ことをテストで固定する (順位 193 の現行の壊れ方を再現する回帰テストを含む)。

### D3 — 再発防止: 順位 ⇄ 詳細エントリの 1:1 対応検査

**D3 の実測 (2026-08-26)**: D2 実施後、順位 table に行が無い `### ` 見出しは **19 件**だった (D2 前のタイトルベース照合での「53 件」は移送後の正しい数ではない)。内訳と処置は次のとおり。

| 分類 | 件数 | 処置 |
|---|---|---|
| 束ね節 (配下に `#### ` タスクを持つ) / 由来別チェックリスト (todo.md ×10) | 10 | **検査対象外** |
| バンドルの束ね節 (todo9.md) | 1 | **検査対象外** |
| 決定の記録 (todo10.md) / 却下の記録 (todo22.md) | 2 | **検査対象外** |
| 単発の観測記録 (todo8.md の stale marker 事象) | 1 | **検査対象外** (2026-08-26 ユーザー判断で様子見) |
| **採番漏れの実タスク** (todo25.md) | **5** | **順位 493-497 を採番**。bugfix-batch-plan.md § 着手前に片付ける 3 件 の項目 2 を同時に解消 |

**タスクエントリの判別子は「`**動機**` を含み、かつ `#### 完了基準` を持つ」に決めた。** 当初案の「配下に `#### ` か `- [ ]` があれば束ね節」は**過剰除外**で使えない — 実タスクも `#### 作業計画` と `- [ ]` を持つため区別できず、採番漏れの 5 件が除外側に落ちた。実測では採番済み 257 件のうち 251 件 (98%) が判別子に該当し、順位を持たない 19 件のうち該当したのは採番漏れの 5 件だけだった (偽陽性 0)。
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved

**やること**

- [cli-docs-lint](../src/cli-docs-lint/) に「summary 行の順位 ⇄ 詳細エントリの順位」の 1:1 対応検査を追加する
- **双方向で検出する** — 順位行があって見出しが無い / 見出しがあって順位行が無い
- **D2 実施後の実測 (2026-08-26)**: 順位 table の 257 行はすべて対応する見出しを持つ (方向 A の違反 0)。残る課題は**方向 B の 53 件** — 順位 table に行が無い `### ` 見出しである。この 53 件の扱い (順位を採番して table へ載せる / 完了済みとして削除する / 検査の対象外と明示する) を D3 の着手時に決める。**そこが決まらないと既存違反 0 での有効化ができない**
- **既存違反 0 で有効化する** — D2 実施後、順位 table の 257 行はすべて対応する見出しを持っており方向 A の違反は 0 だった。方向 B の 19 件は上表のとおり分類し、採番漏れ 5 件へ順位 493-497 を採番して解消した

**完了基準**: 片側だけの登録が `pnpm push` で落ちること。変異テストで検知を確認する。順位 441 のエントリ後始末 (todo22.md 節 + todo-summary2.md 行の削除) を同乗させる。

Expand Down
Loading
Loading