Skip to content

feat(nightly-todo): 順位 table 存在照合ゲートで後始末漏れの再実装を防ぐ (WP lane-model PR-3) - #411

Merged
aloekun merged 1 commit into
masterfrom
claude/lane-model-pr3
Aug 16, 2026
Merged

feat(nightly-todo): 順位 table 存在照合ゲートで後始末漏れの再実装を防ぐ (WP lane-model PR-3)#411
aloekun merged 1 commit into
masterfrom
claude/lane-model-pr3

Conversation

@aloekun

@aloekun aloekun commented Aug 16, 2026

Copy link
Copy Markdown
Owner

目的

台帳に残っているが docs/todo-summary*.md の順位 table から消えた順位を、夜間ループに選ばせない。作業計画 docs/work-plan-nightly-lane-model.md の PR-3 にあたる。

背景 — 後始末は人手なので漏れる

夜間ループの Guard が agent に台帳を書き換えさせない (ADR-072 決定 6) ため、台帳の後始末は人間の責務として残っている。人間が台帳タスクを手で実装してマージした場合、実績では 4 件中 2 件で後始末が漏れていた。残った行は夜間ループにとって「まだ未実装」に見えるため、完了済みのタスクを再実装しうる。

一方、着手フローは完了時に順位 table の行を削除する。順位 table からの消失は「完了 (または取り下げ) 済み」の機械的シグナルであり、台帳の行が残っていてもそちらを見れば気づける。

PR-1 で ADR-033 を改訂し「順位は追記型 ID で再採番しない」と定めたため、順位 table に無い = 消えたと一意に読める。この一意性が本ゲートの前提である。

変更内容

lib-ledgersummary_gate module を新設

  • parse_summary_ranks: 順位 table (順位 + タスク 列を持つ表) から順位集合を抽出。順位 単独で判定すると棚卸し履歴など別の表の数字を拾うため、2 列を要求する
  • select_listed_in_summary: 未掲載の候補を飛ばして次の候補を選び、飛ばした順位を呼び手へ返す。その順位だけを飛ばし run 全体は止めない — stale な 1 行で夜間ループが毎晩何もしなくなるのは、後始末漏れの実害に比べて過剰

cli-nightly-task-select--summary-file を追加

複数指定可・省略不可。省略を許すと、渡し忘れた run が「照合できなかった」ではなく「全順位が載っている」と解釈して完了済みタスクを再実装する (--exclude-ranks と同じ設計)。1 ファイルでも読めなければ exit 2 (fail-closed)。

workflow の配線

Select step へ master-ref/docs/todo-summary.mdtodo-summary2.md を渡す。順位 220 以降は 2 つ目にあるため両方必要。

実測で見つけた自分のバグ

初版パーサは実データで壊れていた。 docs/todo-summary.md の順位 table には途中に空行があり、そこで表が終わったと判定して順位 193 以降を全部「消えた」と誤判定していた。実 exe を実ファイルに当てて初めて露見している (fixture テストでは踏めない穴)。

  • パーサ: 空行では終端せず「空行以外の非表行」で終端する実装へ修正 + 実データ由来の回帰テストを追加
  • データ: 表を分断していた空行も除去 (レンダリング上も 2 つの表に割れていた)

検証

cargo test --workspace green (lib-ledger 113 件、うち新規 13 件) / clippy clean / pnpm lint:docs clean / pre-push takt レビュー security・simplicity とも findings なし。

実 exe を実ファイルに当てて 5 経路を実測:

経路 結果
正常 (実台帳 + 実 summary) 順位 203 を選択、exit 0
未掲載 1 件 [NIGHTLY_WARN] 出力 → 次候補 240 を選択、exit 0
全候補未掲載 警告 3 件 + 「未掲載で飛ばした: 3 件」、exit 3
summary 不読 exit 2 (fail-closed)
--summary-file 欠落 exit 2 + usage

計画からの逸脱 2 点

  1. 警告の出力先を stdout → stderr へ。workflow は stdout を > selected.txt に捨てて許可リストの key= 行だけを転送するため、stdout だと全候補が飛ばされた run (exit 3) で警告が誰にも見えない
  2. 警告文言から「再採番」を削除。PR-1 の ADR-033 改訂で再採番を廃止したため、「完了か取り下げ」の 2 択に絞れる

未実施 — workflow の実走観測

workflow_dispatch はマージ後でないと検証にならない。本 workflow はゲート exe をmaster ref の写しからビルドする (ADR-072 決定 1 の信頼境界) ため、PR ブランチで dispatch すると「新しい引数を渡す workflow」と「その引数を知らない master の exe」の組み合わせになり 未知の引数です で落ちる。

PR-4 も同じ workflow を触るため、PR-4 マージ後に dispatch 1 回で両方を観測する (作業計画の実走確認 2)。

後続

work-plan の PR-4 (ブランチのライフサイクル 2 種) → PR-5。

Summary by CodeRabbit

  • 新機能

    • 複数の順位表をもとに、掲載順位をまとめてタスク選択できるようになりました。
    • 順位表に掲載されていない台帳項目は選択対象から除外し、警告を表示します。
    • 順位表の読み取りエラーを検出し、明確なエラー終了を行います。
  • ドキュメント

    • タスク選択ルールと、順位表から消えた項目の扱いに関する説明を更新しました。

人間が台帳タスクを手で実装してマージした場合、台帳の後始末は人手のため
漏れる (実績 4 件中 2 件)。残った行を夜間ループが再実装しうる。着手フローは
完了時に順位 table の行を消すので、順位 table からの消失を「完了済み」の
機械的シグナルとして使う。

- lib-ledger に summary_gate module を新設
  - parse_summary_ranks: 順位 table (順位 + タスク 列を持つ表) から順位集合を抽出
  - select_listed_in_summary: 未掲載の候補を飛ばして次の候補を選び、飛ばした
    順位を呼び手へ返す (run 全体は止めない)
- cli-nightly-task-select に --summary-file を追加 (複数指定可・省略不可)。
  未掲載順位は stderr へ [NIGHTLY_WARN] を 1 件ずつ出す。stdout は workflow が
  許可リストで絞るため、そちらだと exit 3 の run で警告が見えない
- nightly-todo.yml の Select step へ todo-summary.md / todo-summary2.md を配線
- 実 exe を実ファイルに当てた検証でパーサのバグを発見: todo-summary.md の
  順位 table には途中に空行があり、初版はそこで表が終わったと判定して順位 193
  以降を全部取りこぼしていた。空行では終端しない実装へ修正し、実データ由来の
  回帰テストを追加。データ側の空行も除去した
@coderabbitai

coderabbitai Bot commented Aug 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f38864b-74da-45ea-9af6-0cefbf5101a7

📥 Commits

Reviewing files that changed from the base of the PR and between 5fdd76b and 6d8a2a0.

📒 Files selected for processing (6)
  • .github/workflows/nightly-todo.yml
  • docs/todo-summary.md
  • docs/work-plan-nightly-lane-model.md
  • src/cli-nightly-task-select/src/main.rs
  • src/lib-ledger/src/lib.rs
  • src/lib-ledger/src/summary_gate.rs
💤 Files with no reviewable changes (1)
  • docs/todo-summary.md

Included review availability: Your plan includes up to 1 review per rolling hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

順位表を解析する summary_gate を追加しました。CLIは複数の順位表を読み込み、台帳候補を掲載順位と照合します。夜間ワークフローは2つの要約ファイルを入力します。

Changes

要約順位ゲート

Layer / File(s) Summary
順位表解析と候補選択
src/lib-ledger/src/summary_gate.rs, src/lib-ledger/src/lib.rs
順位 table から順位を解析します。空行と複数 table に対応します。未掲載順位を除外し、次の候補を選択します。
CLI順位照合の統合
src/cli-nightly-task-select/src/main.rs
--summary-file を1つ以上受け付けます。複数ファイルの順位を和集合にします。読み込み失敗時は exit code 2 で終了します。未掲載順位を警告します。
夜間ワークフローと記録の更新
.github/workflows/nightly-todo.yml, docs/work-plan-nightly-lane-model.md, docs/todo-summary.md
夜間ワークフローから2つの要約ファイルを渡します。未選択時の警告と計画文書を更新します。

Estimated code review effort: 4 (Complex) | ~45 minutes

Merge Risk: 🔵 Low · up to 6d8a2

The PR adds summary-table validation to prevent completed tasks from being selected again; the remaining risk is limited to a future-dated documentation statement that should be corrected to avoid misleading maintainers. The PR is mergeable with owner follow-up.

Sequence Diagram(s)

sequenceDiagram
  participant nightly_todo_yml as nightly-todo.yml
  participant cli_nightly_task_select as cli-nightly-task-select
  participant summary_gate
  participant Ledger
  nightly_todo_yml->>cli_nightly_task_select: 2つの --summary-file を指定
  cli_nightly_task_select->>summary_gate: 要約ファイルを解析
  summary_gate-->>cli_nightly_task_select: 順位の和集合を返却
  cli_nightly_task_select->>summary_gate: 台帳候補を順位照合
  summary_gate->>Ledger: 次の候補を取得
  Ledger-->>summary_gate: 台帳候補を返却
  summary_gate-->>cli_nightly_task_select: タスクと skipped_ranks を返却
  cli_nightly_task_select-->>nightly_todo_yml: タスク選択または警告を出力
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルは、順位 table の存在照合ゲートを追加して後始末漏れの再実装を防ぐという主な変更を明確に示しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/lane-model-pr3

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: issue_comment (created) / 実行 run
  • CI: rust (ubuntu-latest) / rust (windows-latest) は pending、request は skipping、CodeRabbit は pass(このリポジトリは OSS 10 stars 未満のため自動レビューがスキップされ、手動トリガー待ち — 待機はしない)
  • レビュー状況: 人間レビュー・インライン指摘ともに 0 件。会話コメントは CodeRabbit の定型「Review available on request」通知のみ (分析価値のある新情報なし)
  • Verdict: user_decision (CI 完走待ち・レビュー未着のため)

Applicable Findings (Critical / High / Major)

(該当なし — レビュー指摘が 0 件のため軽量サマリーとする)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

(該当なし)

差分概要

docs/work-plan-nightly-lane-model.md 記載の WP lane-model PR-3 (順位 table 存在照合ゲート) の実装。6 ファイル変更:

  • src/lib-ledger/src/summary_gate.rs (新規): docs/todo-summary*.md の順位 table をパースし、台帳の候補順位が消えていれば skip する select_listed_in_summary / parse_summary_ranks を追加。実 exe を実データに当てて発見した「表内空行で終端してしまう」パーサバグの回帰テストを含む、テスト充実
  • src/cli-nightly-task-select/src/main.rs: --summary-file (複数指定・省略不可) を追加、未掲載順位を [NIGHTLY_WARN] として stderr へ warn
  • .github/workflows/nightly-todo.yml: Select step に --summary-file を2つ配線 (todo-summary.md / todo-summary2.md)、warn 案内メッセージ追加
  • docs/todo-summary.md: パースバグの原因だった表中の空行を除去 (データ側修正)
  • docs/work-plan-nightly-lane-model.md: PR-3 完了チェックと、ADR-033 改訂 (再採番廃止) に伴う留意点の取り消し線更新

設計判断 (フェイルクローズ、複数 summary ファイルの和集合必須化、skip 時に run 全体を止めない方針など) は本 PR の diff 内コメントおよび ADR-072/ADR-033 と整合しており、逸脱は見当たらない。

次のアクション

  • CI (rust ubuntu-latest / rust windows-latest) の完走を待ち、失敗があれば再度確認する
  • レビュー観点が必要なら @coderabbitai review で手動トリガー可能 (このリポジトリはデフォルトでレビュー未実行)
  • mergeStateStatus: BLOCKED は CI pending 起因の可能性が高く、CI 完走後に再評価が必要

@aloekun
aloekun merged commit d98ce20 into master Aug 16, 2026
4 checks passed
@aloekun
aloekun deleted the claude/lane-model-pr3 branch August 16, 2026 17:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant