From 59a676ef28d279f7197528ff758b78fd22a2bf05 Mon Sep 17 00:00:00 2001 From: aloekun Date: Wed, 13 May 2026 20:38:37 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs(todo):=20Bundle=20k=20=E6=97=A2?= =?UTF-8?q?=E5=AD=98=20entry=20=E3=81=AB=20PR=20#152=20post-merge-feedback?= =?UTF-8?q?=20=E5=86=8D=E8=A6=B3=E6=B8=AC=E3=82=92=E8=BF=BD=E8=A8=98=20(?= =?UTF-8?q?=E9=A0=86=E4=BD=8D=20123/124/126/127)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/todo-summary.md | 10 ++++++---- docs/todo8.md | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/todo-summary.md b/docs/todo-summary.md index 643ba1a..2fd02b5 100644 --- a/docs/todo-summary.md +++ b/docs/todo-summary.md @@ -77,11 +77,11 @@ | 120 | 💎 Tier 3 | **`takt-workflow-persona-without-model` rule コメント拡張 + ADR-007 case study 追記 (PR #150 T1-#1 採用、実体 Tier 3 — analyzer 誤分類)** | todo8.md | XS | なし (実体は docs/comment 修正のみで mechanical enforcement なし → Tier 3 reclassify。次回 takt yaml schema 拡張時の rule 更新フロー文書化 + enumeration-based pattern の case study 記録、Tier 1 #2 ADR case study と同 PR で land 効率的) | | 121 | 🔧 Tier 2 | **`takt_workflow_persona_detects_required_permission_mode_violation` doc 修正 + 残り 3 fields 個別 fixture test 追加 (PR #150 T2-#1 採用)** | todo8.md | S | なし (4 fields のうち 3 fields は個別 fixture test 不在、doc comment と実態乖離。pass_previous_response / output_contracts / parallel の individual test を追加して将来 regex 変更時の regression 検知を担保) | | 122 | 💎 Tier 3 | **`development-workflow.md` Step 0 に「新 todo 着手前の既実装確認」チェックステップ追加 (PR #150 T3-#1 採用)** | todo8.md | XS | なし (memory rule `feedback_verify_task_not_already_done.md` を canonical workflow へ昇格。`jj log --limit 20 ` は決定的コマンドのため `feedback_no_unenforced_rules.md` 例外 = 既存実践の明文化 + 機械実行可能で採用、グローバル設定変更前に `~/.claude/` バックアップ取得必須) | -| 123 | 🚀 Tier 1 | **lint-screen の Markdown ファイル除外フィルター追加 (PR #151 T1-#2 採用) ★ Bundle k** | todo8.md | M | なし (D-3/D-4/D-5 の 3 PR で一貫観測した `.md` への `unused-import` hallucinate FP を構造的に解消。Phase D dogfood 観測から導かれた最も価値ある決定論的防止策、拡張子ベース mechanical filter で実装可能、Frequency High + Adoption Risk None) | -| 124 | 🚀 Tier 1 | **`no-ephemeral-todo-reference` rule の TOML positive test 追加 (PR #151 T1-#1 採用)** | todo8.md | S | なし (extensions 拡張が複数 PR にわたり反復する pattern (yaml/yml = PR #110、toml 等)、test gap 累積を構造的に防ぐ。Frequency Medium で採用基準を満たす) | +| 123 | 🚀 Tier 1 | **lint-screen の Markdown ファイル除外フィルター追加 (PR #151 T1-#2 採用、PR #152 で再観測) ★ Bundle k** | todo8.md | M | なし (D-3/D-4/D-5/**D-6** の 4 PR で一貫観測した `.md` への `unused-import` hallucinate FP を構造的に解消。Phase D dogfood 観測から導かれた最も価値ある決定論的防止策、拡張子ベース mechanical filter で実装可能、Frequency High + Adoption Risk None) | +| 124 | 🚀 Tier 1 | **`no-ephemeral-todo-reference` rule の TOML positive test 追加 (PR #151 T1-#1 採用、PR #152 で再観測)** | todo8.md | S | なし (extensions 拡張が複数 PR にわたり反復する pattern (yaml/yml = PR #110、toml 等)、test gap 累積を構造的に防ぐ。Frequency Medium で採用基準を満たす) | | 125 | 🔧 Tier 2 | **UTF-8 マルチバイト boundary test を他の string-processing hooks に横展開 (PR #151 T2-#1 採用)** | todo8.md | M | なし (PR #151 で `byte_offset_to_line` char-boundary panic bug を test 拡充で発見、同型関数を持つ他 hooks に systemic 防御を確保。test 拡充が production fault detection に直結する事例の横展開) | -| 126 | 💎 Tier 3 | **ADR-038 に mistral:7b 「diff 外 context hallucinate」failure mode を追記 (PR #151 T3-#1 採用、順位 123 と同 PR 推奨)** | todo8.md | XS | なし (3 PR 観測 = High freq の failure mode を ADR codify、Phase b' fixture では再現しない pattern のため永続記録の価値あり、順位 123 と同 PR で実装と仕様の整合性確保) | -| 127 | 💎 Tier 3 | **extensions 拡張時の test 追加 pattern をコード comment で明文化 (PR #151 T3-#2 採用、順位 124 と同 PR 推奨)** | todo8.md | XS | なし (`feedback_no_unenforced_rules.md` 例外 = 既存実践の明文化 + 機械強制ではなく guide 効果。順位 124 と同 PR で test location を正確に参照、順位 122 と同じロジック) | +| 126 | 💎 Tier 3 | **ADR-038 に mistral:7b 「diff 外 context hallucinate」failure mode を追記 (PR #151 T3-#1 採用、順位 123 と同 PR 推奨、PR #152 で再観測)** | todo8.md | XS | なし (**4 PR 観測** = High freq の failure mode を ADR codify、Phase b' fixture では再現しない pattern のため永続記録の価値あり、順位 123 と同 PR で実装と仕様の整合性確保) | +| 127 | 💎 Tier 3 | **extensions 拡張時の test 追加 pattern をコード comment で明文化 (PR #151 T3-#2 採用、順位 124 と同 PR 推奨、PR #152 で再観測)** | todo8.md | XS | なし (`feedback_no_unenforced_rules.md` 例外 = 既存実践の明文化 + 機械強制ではなく guide 効果。順位 124 と同 PR で test location を正確に参照、順位 122 と同じロジック) | **戦略**: Tier 1 を 2〜3 セッションで片付け → Tier 2 で ADR-032 の前提 + rate-limit + convergence cost 削減を進める → Tier 3 で ADR-032 を land + ドキュメント整備。Tier 4-5 は cleanup / 外部展開で daily efficiency への直接効果は小さい。 @@ -124,3 +124,5 @@ **Bundle j (PR #133 post-merge-feedback、docs/ 整合性多層検証、2026-05-09)**: PR #133 (todo.md / todo5.md 50KB 分割) merge 後の post-merge-feedback で 9 findings 中 **3 件採用** (Tier 1 #1 / Tier 2 #3, #4) で **3 層対策**: (1) **規約層** = 順位 94 (`(?i)\]\(\.\./docs/` regex 1 行で `docs/` 配下からの逆戻り参照を block) は CodeRabbit が PR #133 で実検出した broken link を決定論的に防止、(2) **CI 検証層** = 順位 95 (preamble file count 自動照合) は todo*.md 分割が今後反復する pattern (todo3 → 4 → 5 → 6 → 7) のため Frequency Medium で採用、(3) **包括的 link 検証層** = 順位 96 (Markdown cross-reference validator、directory-aware resolution) は順位 10 (ADR-032 PR-broken-link) と方向性近接で fold-in 検討余地あり。**Sub-PR 構成**: **j-1 (順位 94、`.claude/custom-lint-rules.toml` 規約追加) は land 済 (Phase d P-2)** / j-2 (順位 95 + 96、`.github/workflows/lint.yml` 新設 = workflows 未存在 repo の最初の workflow 整備、Effort S+M、まとめて land が効率的)。**却下** (2 件): T1 #2 (prose 数詞 lint、NLP 必要 + FP 確実) / T3 #5/#6 (機械検知不可ルール追加、`feedback_no_unenforced_rules.md` 適用)。**様子見** (3 件): T3 #7 (ADR-035 not_applicable と GitHub thread state の乖離明文化、1 観測のみ) / T3 #8 (ADR-030 AFK wakeup 時 PR body intent ルール化、1 観測のみ) / T3 #9 (50KB 分割原則 CLAUDE.md 明文化、機械検知不可)。**本 PR 含意**: 順位 94 = 「決定論的防止層」哲学 (Bundle Z #B-α 系譜)、順位 95-96 = 「規約だけでは塞げない構造的検証は CI で」(ADR-031 週次レビューと相補)。`.github/workflows/` 未存在 repo に最初の workflow を追加する転換点でもあり、scope 慎重判断が必要。 **Bundle k (PR #151 post-merge-feedback、Phase D dogfood 観測由来の lint-screen FP 対策、2026-05-13)**: PR #151 (Phase D D-5 = comment-lint test 拡充 + MAX cap test) merge 後の post-merge-feedback で 11 findings 中 **5 件採用** (Tier 1 #1, #2 / Tier 2 #1 / Tier 3 #1, #2) を 5 entries (順位 123-127) で登録。**コア発見**: D-3 (PR #148) / D-4 CR fix (PR #150) / D-5 ×2 (PR #151) の 3 PR・4 push events で「mistral:7b が docs-only diff や `.md` ファイルに対して Rust の `unused-import` を hallucinate する」FP pattern が一貫して観測 = Phase b' fixture では再現しない failure mode。**順位 123 (lint-screen MD 除外フィルター、Tier 1 / M / High freq)** が最重要 = 拡張子ベース mechanical filter で構造的に解消可能、Phase D dogfood 観測から導かれた最も価値ある決定論的防止策。**Sub-PR 推奨**: k-1 (順位 123 + 126、実装 + ADR-038 codify、Effort M+XS、コア層) / k-2 (順位 124 + 127、TOML test + extensions code comment、Effort S+XS、test gap 補強層) / k-3 (順位 125、UTF-8 boundary 横展開、Effort M、独立) で 3 PR 分割推奨。**却下** (4 件): UTF-8 lint rule (FP リスク、AST 必須) / `byte_offset_to_line` 強化 (PR #151 で既対応) / UTF-8 guideline + extensions checklist (`feedback_no_unenforced_rules.md` 適用)。**様子見** (3 件): T2 #2 (lint-screen dogfood CI step、L effort + takt test infra 調査依存) / T3 #3 (test 拡充→bug 発見 pattern を ADR-007 記録、1 PR 観測のみ) / T3 #4 (multi-rule scenario fixture pattern を test comment 明文化、Low × Low)。**本 PR 含意**: Phase D dogfood 観測 (analysis.md L334-340) が直接 actionable な決定論的防止層 (順位 123) に結実、Phase E 採否判定前に systemic FP root cause が解消される構造的進展。 + +**Bundle k 補強 (PR #152 post-merge-feedback、D-6 docs-only PR、2026-05-13)**: PR #152 (Phase D D-6 = fix.md instruction-level review-diff refresh + Bundle k 順位 123-127 entry 登録) merge 後の post-merge-feedback で 8 findings 中 4 件採用 (Tier 1 #1 / Tier 2 #1 / Tier 3 #1, #2)。**全 4 件が Bundle k 既存エントリ (順位 123/124/126/127) と完全重複** = post-merge-feedback analyzer 自身が「Bundle k 優先度 X で既に roadmap 済」と明記。新規順位を追加せず、**既存 4 entries (順位 123/124/126/127) に PR #152 を追加観測として追記** (frequency 観測: 3 PR → **4 PR** に更新、Bundle k の優先度 / Sub-PR 分割推奨は不変)。**含意**: PR #152 (docs-only) でも `.md` への `unused-import` FP が同根 root cause で再現したことが「lint_screen FP は diff 内容ではなく hook source 周辺 context を見て hallucinate している」仮説を 4th observation として裏付け = 順位 123 拡張子フィルター実装の confidence 向上。**様子見** (2 件): PostToolUse hook 自動化 (案 D、Frequency Low) / fix.md 自己参照 ambiguity (1 PR 観測のみ、次回 fix.md 編集機会に opportunistic 適用)。**却下** (2 件): 機械検知不可な `~/.claude/rules/*` 追加 (memory `feedback_no_unenforced_rules.md` 適用)。 diff --git a/docs/todo8.md b/docs/todo8.md index 2c9cb7f..e9bef99 100644 --- a/docs/todo8.md +++ b/docs/todo8.md @@ -160,11 +160,11 @@ --- -### lint-screen の Markdown ファイル除外フィルター追加 (PR #151 T1-#2 採用、Bundle k) +### lint-screen の Markdown ファイル除外フィルター追加 (PR #151 T1-#2 採用、Bundle k、**PR #152 で再観測**) -> **動機**: PR #148 (D-3) / PR #150 (D-4 CR fix) / PR #151 (D-5) の 3 PR で「mistral:7b が docs-only diff や `.md` ファイルに対して Rust の `unused-import` を hallucinate する」false positive pattern が一貫して観測。特に PR #151 では docs-only diff (analysis.md 67 行) でも同じ FP を再現し、reviewer が "the report documents its own false positive" と評価。**diff 内容ではなく hook source 周辺の context を見て hallucinate している強い証拠**。拡張子ベースの mechanical フィルタで diff 段階から `.md` ハンクを除外すれば、reviewer cross-check の負荷も軽減できる。 +> **動機**: PR #148 (D-3) / PR #150 (D-4 CR fix) / PR #151 (D-5) / **PR #152 (D-6 docs-only)** の 4 PR で「mistral:7b が docs-only diff や `.md` ファイルに対して Rust の `unused-import` を hallucinate する」false positive pattern が一貫して観測。特に PR #151 / PR #152 では docs-only diff でも同じ FP を再現 (PR #152 では `docs/local-llm-offload-analysis.md` 行 1 を `use std::io::Write;` と誤認)。**diff 内容ではなく hook source 周辺の context を見て hallucinate している強い証拠**。拡張子ベースの mechanical フィルタで diff 段階から `.md` ハンクを除外すれば、reviewer cross-check の負荷も軽減できる。 > -> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 1 #2 採用 (Severity Medium / Frequency High / Effort M / Adoption Risk None)。Phase D dogfood 観測から導かれた最も価値ある決定論的防止策。Bundle k のコア。 +> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 1 #2 採用 → PR #152 post-merge-feedback で Frequency High 閾値到達を再確認 (Severity Medium / Frequency High / Effort S / Adoption Risk None)。Phase D dogfood 観測から導かれた最も価値ある決定論的防止策。Bundle k のコア。 > > **参照**: `.claude/feedback-reports/151.md` Tier 1 #2、`src/cli-push-runner/src/stages/lint_screen.rs`、D-3/D-4/D-5 outcome (`docs/local-llm-offload-analysis.md`) @@ -191,11 +191,11 @@ --- -### `no-ephemeral-todo-reference` rule の TOML positive test 追加 (PR #151 T1-#1 採用) +### `no-ephemeral-todo-reference` rule の TOML positive test 追加 (PR #151 T1-#1 採用、**PR #152 で再観測**) > **動機**: PR #151 の CodeRabbit nitpick (および本 PR で発見されなかった latent gap) で、`no-ephemeral-todo-reference` rule が TOML ファイルを extensions に持つ場合の positive test (= 実際に violation を検出することの assertion) が不在と判明。既存テスト `no_ephemeral_todo_self_exclusion_invariant_holds_on_deployed_toml` は self-exclusion 確認のみで、検出力の test ではない。 > -> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 1 #1 採用 (Severity Medium / Frequency Medium / Effort S / Adoption Risk None)。extensions 拡張が複数 PR にわたって反復する pattern (yaml/yml = PR #110、toml = PR #129?) があり、test gap が累積するリスクを構造的に防ぐ。 +> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 1 #1 採用 → PR #152 post-merge-feedback で再確認 (Severity Medium / Frequency Medium / Effort S / Adoption Risk None)。extensions 拡張が複数 PR にわたって反復する pattern (yaml/yml = PR #110、toml = PR #129?) があり、test gap が累積するリスクを構造的に防ぐ。PR #152 post-merge-feedback でも「yaml/yml test gap (PR #110) + TOML test gap (PR #151) の 2 PR 連続観測」と同根の指摘あり。 > > **参照**: `.claude/feedback-reports/151.md` Tier 1 #1、`src/hooks-post-tool-linter/src/main.rs` test module @@ -236,11 +236,11 @@ --- -### ADR-038 に mistral:7b 「diff 外 context hallucinate」failure mode を追記 (PR #151 T3-#1 採用、順位 123 と同 PR 推奨) +### ADR-038 に mistral:7b 「diff 外 context hallucinate」failure mode を追記 (PR #151 T3-#1 採用、順位 123 と同 PR 推奨、**PR #152 で再観測**) -> **動機**: PR #148 (D-3) / PR #150 (D-4 CR fix) / PR #151 (D-5 ×2) の 3 PR で観測された FP pattern = 「mistral:7b が diff 内容に関わらず hook source 周辺の context を見て `unused-import` を hallucinate する」を ADR-038 に codify。Phase b' fixture では再現しない failure mode のため、将来の prompt 改善や別モデル評価時の prior assumption として永続記録する価値あり。 +> **動機**: PR #148 (D-3) / PR #150 (D-4 CR fix) / PR #151 (D-5 ×2) / **PR #152 (D-6 docs-only)** の 4 PR で観測された FP pattern = 「mistral:7b が diff 内容に関わらず hook source 周辺の context を見て `unused-import` を hallucinate する」を ADR-038 に codify。Phase b' fixture では再現しない failure mode のため、将来の prompt 改善や別モデル評価時の prior assumption として永続記録する価値あり。 > -> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 3 #1 採用 (Severity Low / Frequency High = 3 PR 観測 / Effort XS / Adoption Risk None)。順位 123 (lint-screen MD フィルタ実装) と同 PR で land 効率的 (実装と仕様の整合性確保)。 +> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 3 #1 採用 → PR #152 post-merge-feedback で 4 PR 観測に拡大 (Severity Low / Frequency High / Effort XS / Adoption Risk None)。順位 123 (lint-screen MD フィルタ実装) と同 PR で land 効率的 (実装と仕様の整合性確保)。 > > **参照**: `.claude/feedback-reports/151.md` Tier 3 #1、`docs/adr/adr-038-local-llm-finding-classification.md`、D-3/D-4/D-5 outcome (`docs/local-llm-offload-analysis.md`) @@ -259,11 +259,11 @@ --- -### extensions 拡張時の test 追加 pattern をコード comment で明文化 (PR #151 T3-#2 採用、順位 124 と同 PR 推奨) +### extensions 拡張時の test 追加 pattern をコード comment で明文化 (PR #151 T3-#2 採用、順位 124 と同 PR 推奨、**PR #152 で再観測**) > **動機**: 順位 124 (TOML positive test) の根因である「extensions 配列を変更しても対応する test が追加されない」pattern を、`custom-lint-rules.toml` または `no_ephemeral_todo_reference_rule()` 関数の近傍コメントに明記。「extensions を変更した際は対応する positive/negative test を追加すること」のリマインダを次回 rule 変更時に目に入る位置に置く。 > -> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 3 #2 採用 (Severity Low / Frequency Medium / Effort XS / Adoption Risk None)。memory rule `feedback_no_unenforced_rules.md` に抵触するように見えるが、本 case は **既存実践の明文化 + 機械強制ではなく guide 効果** のため例外採用 (順位 122 と同じロジック)。 +> **本タスクの位置づけ**: PR #151 post-merge-feedback Tier 3 #2 採用 → PR #152 post-merge-feedback で再確認 (Severity Low / Frequency Medium / Effort XS / Adoption Risk None)。memory rule `feedback_no_unenforced_rules.md` に抵触するように見えるが、本 case は **既存実践の明文化 + 機械強制ではなく guide 効果** のため例外採用 (順位 122 と同じロジック)。PR #152 post-merge-feedback でも「point-of-edit reminder は enforcement ゼロでも omission 抑止効果あり」と同様の判断で再採用された。 > > **参照**: `.claude/feedback-reports/151.md` Tier 3 #2、`.claude/custom-lint-rules.toml`、`src/hooks-post-tool-linter/src/main.rs` From 04fba45bb87ace338fafe62f6895e0f7a9c6358e Mon Sep 17 00:00:00 2001 From: aloekun Date: Wed, 13 May 2026 20:38:37 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs(llm-offload):=20D-6=20=E5=AE=8C?= =?UTF-8?q?=E4=BA=86=E5=8F=8D=E6=98=A0=20+=20Phase=20A=E3=80=9CD=20?= =?UTF-8?q?=E8=A9=B3=E7=B4=B0=E3=82=92=20phase-d-outcomes.md=20=E3=81=AB?= =?UTF-8?q?=E5=88=86=E9=9B=A2=20(analysis.md=2049KB=20=E2=86=92=2026KB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/local-llm-offload-analysis.md | 207 ++++----------------- docs/local-llm-offload-phase-d-outcomes.md | 190 +++++++++++++++++++ 2 files changed, 225 insertions(+), 172 deletions(-) create mode 100644 docs/local-llm-offload-phase-d-outcomes.md diff --git a/docs/local-llm-offload-analysis.md b/docs/local-llm-offload-analysis.md index 9ace5d0..5ac07d4 100644 --- a/docs/local-llm-offload-analysis.md +++ b/docs/local-llm-offload-analysis.md @@ -1,14 +1,16 @@ # ローカル LLM オフロード — 残作業計画 (Phase b 以降) -> **位置づけ**: 本ファイルは「残作業の **次に何をするか** だけ」を持つ実行計画。完了済みの分析・実装・dogfood 計測・retrospective は [local-llm-offload-history.md](local-llm-offload-history.md) に切り出した。 +> **位置づけ**: 本ファイルは「残作業の **次に何をするか** だけ」を持つ実行計画。完了済みの分析・実装は以下に切り出し済: +> - [local-llm-offload-history.md](local-llm-offload-history.md) — 旧計画 (§A-2 dogfood 等) + Phase a-c 以前の retrospective +> - [local-llm-offload-phase-d-outcomes.md](local-llm-offload-phase-d-outcomes.md) — Phase A〜D 各 PR の詳細 dogfood outcome / Phase E 判定材料 / Dogfood signal log (2026-05-13 分離) > -> **状態**: 試験運用 (Phase a 完了 = PR #130 land / Phase b 完了 = conditional GO 2026-05-08, PR #131 / Phase c MVP 完了 = PR #132 land 2026-05-08 / **Phase c+ Bundle i 完了 = PR #135 land 2026-05-09 / §8.D 完了 = PR #136 land 2026-05-09 (num_ctx 8192、agreement 86.7% / verdict GO) / Phase d kickoff prep 完了 = 2026-05-10 / Phase d Round 1 完遂 = 2026-05-12 (D-1〜D-3、実 dogfood は D-3 単独 1 data point) / Phase d Round 2 進行中 = 2026-05-13 (D-4 完遂 → PR #150 merged、累積 3 data points / 5 PR 計画、残 D-5/D-6/D-7)** ([docs/local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md) 参照))。 +> **状態**: 試験運用 (Phase a〜c 完了 / Phase c+ Bundle i + §8.D 完了 = PR #135/#136 / **Phase d Round 1 完遂 = 2026-05-12 (D-1〜D-3) / Phase d Round 2 進行中 = 2026-05-13 (D-4/D-5/D-6 完遂 → 累積 6 data points / 4 PR、残 D-7)** — 詳細は outcomes ファイル参照)。Phase d 運用ガイドは [docs/local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md)。 > -> **引退条件**: 以下のいずれかで本ファイルを削除する (docs-governance.md retirement workflow 準拠)。`local-llm-offload-history.md` も同タイミングで判断する。 -> - 残作業 (§8.D / §8.E / §8.F, §1 Phase b/c/d) が **すべて land または却下** された場合 → permanent value (採用された設計判断、却下理由) を ADR-038 に migrate して両ファイルを削除 -> - **6 ヶ月経過** (= 2026-11-08) しても §8.E (lint screen facet) の採否が決まらない場合 → 採用見込みなしとみなして両ファイルを削除 +> **引退条件**: 以下のいずれかで **3 ファイル (analysis.md / history.md / phase-d-outcomes.md) を同時削除** する (docs-governance.md retirement workflow 準拠): +> - 残作業 (§8.D / §8.E / §8.F, §1 Phase b/c/d) が **すべて land または却下** → permanent value を ADR-038 に migrate +> - **6 ヶ月経過** (= 2026-11-08) しても §8.E 採否未決 → 採用見込みなしとみなして削除 > -> **本ファイルだけで Phase b 以降を再開できることを目的とする**。背景 (なぜこの構造に至ったか) は history ファイル参照。 +> **本ファイルだけで Phase b 以降を再開できることを目的とする**。完了詳細は outcomes ファイル、背景は history ファイル参照。 ## 1. Phase a-d 実行計画 (§11.6 から継承、Phase a 完了) @@ -201,149 +203,31 @@ cargo test -p cli-finding-classifier --test lint_screen_evals -- \ > > **進行方針 (2026-05-11、kill-switch 100% trend を踏まえた pivot)**: dogfood を一度止めて broken signal の repair (順位 98 = `num_ctx` overflow detection 診断) を最優先。診断 → root cause 特定 → fix → clean dogfood の順で進む。Bundle c-1 (旧 P-4) や Bundle c の他項目は **本 critical path 外** として通常 Tier 1 優先度で別途処理。 -##### 🚀 Phase A: Diagnostic ✅ **完了 (PR #142、2026-05-11)** +##### 📊 Phase A〜D 経過サマリー (完了済み詳細は [phase-d-outcomes.md](local-llm-offload-phase-d-outcomes.md) 参照) -**順位 98 実装完了** = `lib-ollama-client` の `generate_json` に `OllamaMetadata` (`prompt_eval_count` / `eval_count` / `num_ctx`) を組み込み、serde parse error 時に stderr へ warn log を emit する診断層を追加。`OllamaApi` trait の `generate_with_metadata` (default fallback あり、StubOllama は変更不要)、`emit_overflow_diagnostic` 関数で 90% 以上時に「num_ctx を増やす hint」を含める。16 unit test pass、cli-finding-classifier 経由でも warn log が stderr に出ることを smoke 確認。 - -##### 🔍 Phase B: Root cause identification ✅ **完了 (Phase A 即時 dogfood、2026-05-11)** - -Phase A 実装後、PR #141 (P-3 = 187 行 mixed diff) を replay → **`prompt_eval_count: 8192 (vs num_ctx: 8192)` = 100% 到達を実機確認**。**真因 = num_ctx truncation で確定**。mistral の prompt が完全に context cap で truncate されて JSON output が完成せず `screen_decision` field 欠落の症状を引き起こしていた。仮説 2 候補 (num_ctx truncation / mistral 出力崩壊) のうち前者が真因と decisive 判定。 - -##### 🔧 Phase C: Root cause fix ✅ **完了 (PR #143、2026-05-11)** +| Phase | 状態 | PR | 主成果 | +|---|---|---|---| +| 🚀 A: Diagnostic | ✅ 完了 | #142 (2026-05-11) | `lib-ollama-client` に `OllamaMetadata` (num_ctx overflow 診断) を実装 | +| 🔍 B: Root cause id | ✅ 完了 | (A 即時 dogfood) | `prompt_eval_count: 8192 / num_ctx: 8192` = num_ctx truncation が真因と確定 | +| 🔧 C: Root cause fix | ✅ 完了 | #143 (2026-05-11) | `DEFAULT_NUM_CTX 8192 → 32768`、smoke 3 PR で fallback 100% → 33% に解消 | +| 🛠️ D 前提整備 (順位 109) | ✅ 完了 | #144 (2026-05-11) | `.takt/lint-screen-report.md` に `## Diagnostic` section、real pipeline 経由で warn log が visible | +| 🔄 D Round 1 (D-1〜D-3) | ✅ 完遂 | #145/#146/#147/#148 (2026-05-12) | env var override (順位 115) 解消、D-3 で初の real lint_screen 観測 = 1 data point | +| 🔄 D Round 2 (D-4〜D-6) | ✅ 完遂 | #150/#151/#152 (2026-05-13) | size ramp-up + verdict variance 観測、累積 6 data points / 4 PR | +| 🔄 D Round 2 (D-7) | 未着手 | (Bundle c-1) | cli-merge-pipeline Drop guard / orphan reaper / ADR-030 spec | -`DEFAULT_NUM_CTX = 8192 → 16384` (initial) → 16384 でも 100% overflow を再観測 → `DEFAULT_NUM_CTX = 16384 → 32768` (mistral:7b theoretical max) に再増加。`lib_ollama_client` の lint test 17 件 pass、`cli-finding-classifier` evals 20 件 pass。副次的に `push-runner-config.toml` の `step_timeout = 180 → 600` に拡大 (num_ctx 増加で `cargo test -- --ignored` の 12 件 mistral invoke が long-running 化)。 +**Phase E 着手前提条件 = 3-5 PR 累積 dogfood は D-6 完遂時点で既に充足** (4 PR / 6 data points)。D-7 完遂後に Phase E (採否判定) 移行可能。Round 1/2 で観測した **false positive 5 件中 5 件が file-type / scope 混同型** (mistral:7b の context window 内 hook source 周辺 hallucinate) → Bundle k 順位 123 (MD 除外フィルター) の構造的解消対象。詳細 metrics・観測の意義・各 PR の dogfood outcome は [phase-d-outcomes.md](local-llm-offload-phase-d-outcomes.md) 参照。 -**Phase C smoke dogfood** (32768 で 3 PRs replay): +##### 🔄 Phase D Round 2 残: D-7 (Bundle c-1) -| PR | Lines | Latency | Old (8192) | **New (32768)** | +| Order | 構成 | Tier / Effort | 推定 diff 行 | Diff Profile | |---|---|---|---|---| -| P-1 (#139) | 414 | 48s | fallback (truncation) | ✅ `auto_fix` (real classification) | -| P-2 (#140) | 275 | 50s | fallback (truncation) | ⚠️ fallback (`invalid severity: error` = contract violation、num_ctx ではなく mistral semantic 精度の別問題) | -| P-3 (#141) | 487 | 55s | fallback (truncation) | ✅ `auto_fix` (real classification) | - -- **num_ctx truncation 起因 fallback: 3/3 → 0/3 (100% 解消)** ← Phase C 主目的を達成 -- **総合 fallback rate: 3/3 (100%) → 1/3 (33%)** ← **Phase D 基準 (<50%) を classifier preview で達成** -- 残り 1/3 は mistral 出力の contract violation (Phase b' agreement 75% で説明可能な semantic 精度問題、別 phase で対応 / Phase D scope 外) - -##### 🛠️ Phase D 前提整備 (順位 109) ✅ **完了 (PR #144、2026-05-11)** - -`src/cli-push-runner/src/stages/lint_screen.rs` 改修: graceful fallback (exit 0) 時にも classifier stderr を `.takt/lint-screen-report.md` の `## Diagnostic` section に取込。Phase A 診断 warn log が **real pipeline 経由で visible** になる状態を確保。新 struct `ClassifierOutput { stdout, stderr }`、新 helper `render_diagnostic`、新規 smoke test 4 件 (TP / FP / edge case / parse-error path) で contract を seal。lint_screen tests 14/14 pass + workspace 全 cargo test pass。 - -##### 🔄 Phase D: Clean dogfood validation (real pipeline 経由、Round 1 完遂 2026-05-12 / Round 2 進行中 = D-4 完遂 2026-05-13 / 残 D-5/D-6/D-7) - -Phase C fix + Phase D 前提整備 (順位 109) 完了で **real pipeline 経由 dogfood の必要十分条件が揃った**。D-1 着手時に session-only opt-in workflow が jj auto-snapshot と本質的に衝突する gap が判明したが、**順位 115 (`LINT_SCREEN_ENABLED` env var override) land で解消**。env var 経路 (`$env:LINT_SCREEN_ENABLED = "true"`) で `push-runner-config.toml` を編集せずに lint_screen を有効化できるため、D-3 で初の実 dogfood が成立し、計画 3 PR + prereq 1 PR がすべて land 完了。 - -**Phase D Round 1 対象 PR 構成 (D-1〜D-3、2026-05-12 完遂)**: - -| Order | 構成 (todo-summary.md priority list より) | Effort | 実 diff 行 | Diff Profile | 状態 | -|---|---|---|---|---|---| -| **D-1** ✅ | 順位 112 + 113 + 114 = ADR amendments bundle (ADR-038 eprintln scope / ADR-027 metrics override / 新規 ADR Local LLM context size) + 順位 115 backlog 化 | S+ | 298 (insert 228 / delete 70) | docs + 1 Rust comment | **PR #145 land 済 (2026-05-12)**、lint_screen dogfood は skip (workflow gap) | -| **D-2** ✅ | 順位 101 + 106 + 103 = lint rule code touch (rule⑧ edge case test / self-exclusion assertion / lint runner field comment) | S+S+S | 172 (insert 84 / delete 88) | Rust test/comment mix | **PR #146 land 済 (2026-05-12)**、lint_screen dogfood は skip (順位 115 未 land 時点) | -| **115** ✅ | `LINT_SCREEN_ENABLED` env var override (D-1 で発見した workflow gap 解消) | S | 325 (insert 268 / delete 57) | Rust impl + 10 tests + Phase D guide rewrite | **PR #147 land 済 (2026-05-12)**、D-3 着手 unblock | -| **D-3** ✅ | 順位 102 = `paths` filter を lint runner に実装 (impl + test、既存 rule⑧ migration は 順位 118 で trade-off 検討に保留) | M | 496 (insert 375 / delete 121) | Rust impl + 7 unit tests + globset 依存追加 + glob filter helper | **PR #148 land 済 (2026-05-12)、初の real lint_screen dogfood 観測** | - -**size ramp-up 設計**: small → mid → mid-large の漸増で、small PR 単体での fallback 観測と large PR で num_ctx 限界に近づく挙動を両方カバー。**D-1 / D-2 は workflow gap により lint_screen dogfood をスキップ、実質 metrics 観測は D-3 のみ**。3 PR 観測予定だったが kill-switch 基準 (3/5 で停止) を踏まえて D-3 単独で 1 dogfood data point を取得済。Phase E 採否判定は次回以降の通常 PR 累積で確定する設計に変更。 - -**D-1 / D-2 dogfood outcome (skip 理由 + 副産物)**: - -- lint_screen dogfood は実施せず (D-1 着手時の workflow gap が両 PR で持続) -- 副産物 (D-1): **workflow gap を systemic に発見 + 順位 115 を Tier 1 backlog 登録 + post-merge-feedback Tier 1 #1 で再 validate** -- 副産物 (D-1): ADR-040 内部不整合 (3.33x label vs `(num_ctx/8192)*180s` formula = 4x) は takt review 1 iter で検出 → fix で解消、post-merge-feedback Tier 3 #1 で sublinear clarification 採用 (順位 116) -- 副産物 (D-1): lib.rs L128-139 → ADR-040 移管 edit order を post-merge-feedback Tier 3 #3 で codify 採用 (順位 117) -- 副産物 (D-2): clean merge (post-merge-feedback 0 件採用)、feedback loop 正常動作を再確認 - -**D-3 dogfood outcome (Phase D 初の real lint_screen 観測、PR #148)**: - -| Metric | 観測値 | -|---|---| -| screen_decision | `auto_fix` | -| findings 件数 | 1 (minor severity) | -| finding 内容 | `unused-import` rule、`src/hooks-post-tool-linter/Cargo.toml:12` で `globset` を誤検出 | -| finding accuracy | **false positive** (takt reviewer が main.rs での import 使用済を diff verify で dismiss) | -| fallback_reason | なし (clean run、JSON parse error 無し) | -| `## Diagnostic` section | 不在 = num_ctx 32768 で overflow 発生せず (Phase A 診断 log emit せず) | -| lint_screen latency | 推定 ~80-120s (pipeline 総 628s − takt 248s − その他) | -| kill-switch (fallback > 50%) | fallback 0/1 = 0% → 基準内 | - -**D-3 観測の意義**: - -1. **env override 経路の実証**: PR #147 で実装した `LINT_SCREEN_ENABLED` env var で `[lint_screen] enabled = false` (TOML default) を override し、commit-free な session opt-in が成立 -2. **num_ctx 32768 の容量実証**: ~270 line Rust diff (Cargo.toml + main.rs + Cargo.lock + docs) を overflow せず完走、Phase A 診断 log も emit せず -3. **lint_screen が takt reviewer の context として活用**: reviewer 出力に「Lint-screen finding: false positive」と明示的に評価あり = advisory consumption が成立 -4. **1 false positive は Phase b' agreement 75% (= 25% disagreement) と整合**: 想定範囲内、複数 PR 累積評価が前提 -5. **副産物 (D-3 post-merge-feedback)**: `MAX_CUSTOM_VIOLATIONS` outer/inner loop break scope の explicit test 必要性を発見 (Tier 2-1 採用、順位 119)、rule⑧ への paths filter 適用範囲検討を順位 118 として backlog 化 - -**Phase D Round 2 対象 PR 構成 (D-4〜D-7、2026-05-13 追加)**: - -Round 1 で実 dogfood data point が **1 件のみ** (D-3) に留まり、ADR-038 採用条件「5 PR 以上」+ analysis.md「3-5 PR 累積」前提との乖離が判明。D-1 反省 (docs-only は lint_screen findings 0 件で metrics 価値低) + workflow gap 解消済 (順位 115 = `LINT_SCREEN_ENABLED` env var override land、PR #147) を踏まえ、**残 4 PR で Rust code 中心 + size ramp-up + 累積 5 PR (D-3 + D-4〜D-7) 達成** を狙う延長計画を策定。 - -| Order | 構成 (todo-summary.md priority list より) | Tier / Effort | 推定 diff 行 | Diff Profile | 状態 | -|---|---|---|---|---|---| -| **D-4** ✅ | 順位 39 単独 = takt workflow `model` 必須化 lint rule + 副次作業 (`.takt/workflows/*.yaml` の `persona:` 行 3 件に `model:` 明示追加で clean baseline 確保) + CR Major fix で 4 fields 追加 | T1 / S | 実 ~340 行 (commit 0c2cc07d + 1ec15686) | Rust lint rule (yaml multi-line regex、enumeration 方式) + 6+1 unit tests + custom-lint-rules.toml entry + 3 yaml site touch + CR Major fix | **PR #150 merged 2026-05-13、初 real lint_screen 観測 2 data points (initial + CR fix push)** | -| **D-5** ✅ | 順位 56 + 119 bundle = comment-lint hook test 拡充 + `MAX_CUSTOM_VIOLATIONS` outer/inner loop break scope explicit test + 副産物として `byte_offset_to_line` の char-boundary panic bug fix | T2+T2 / S+S | 実 ~120 行 (test 12 件追加 + production fix 1 行) | hooks-post-tool-comment-lint-rust + hooks-post-tool-linter test infra (UTF-8 multi-byte 5 + block boundary 6 + multi-rule MAX cap 2 + direct unit test 1) | **着手済** | -| **D-6** | 順位 51 単独 = `.takt/review-diff.txt` を fix→review iteration 間で refresh (案 A takt hook 不可と判明 → 案 C fix.md instruction-level refresh に pivot) | T1 / M→S | 実 ~80 行 (fix.md 追記 + todo7.md / analysis.md 更新) | takt facet instruction (markdown) + design docs | **着手済 (本 PR、impl 完了 / dogfood pending)** | -| **D-7** | Bundle c-1 (順位 63 + 64 + 67) = cli-merge-pipeline Drop guard / signal handler + orphan run reaper + ADR-030 spec amendment | T1×2 + T3 / M+M+XS | ~600-800 | Rust impl + signal trap + reaper logic + ADR markdown | 未着手 | - -**size ramp-up 設計 (Round 2)**: small → small-mid → mid → mid-large で num_ctx 32768 容量限界に向け漸増、各 size 帯で fallback 発生率 / Phase A diagnostic warn log 出力有無を観測。D-3 (mid, 496 行) と組合せて 5 size 帯をカバー。 +| **D-7** | Bundle c-1 (順位 63 + 64 + 67) = cli-merge-pipeline Drop guard / signal handler + orphan run reaper + ADR-030 spec amendment | T1×2 + T3 / M+M+XS | ~600-800 | Rust impl + signal trap + reaper logic + ADR markdown | -**D-1 反省の適用 (Round 2)**: +**想定リスク (D-7)**: -- ❌ **docs-only PR を回避**: D-4〜D-7 すべて Rust impl/test 中心 (D-7 で ADR markdown 1 つを bundle 内で同梱するのみ、主成分は Rust) -- ✅ **workflow gap 解消済**: 順位 115 (`LINT_SCREEN_ENABLED` env var) で session-only opt-in が成立、`push-runner-config.toml` 編集不要 -- ✅ **dogfood 実施可否を事前確認**: 各 PR 着手時に (a) env var set 確認 / (b) Ollama 起動確認 / (c) PR が code change を含むこと を check - -**想定リスク (Round 2)**: - -- **D-7 (Bundle c-1) size 上限超過リスク**: M+M+XS が 800 行を超えた場合、c-1a (順位 63 単独) / c-1b (順位 64+67) の 2 PR 分割に switch。その場合は D-7 → D-7a/D-7b で 5 PR に拡張 (Phase E 判定材料が 1 件増える方向で副次的に valid) -- **D-4 size の下振れリスク**: 順位 39 単独 + 3 yaml site touch + tests は ~150-280 行を見込むが、focused single-purpose PR として 250 lower bound 未達も許容 -- **detail 見積もりの精度**: 各 todo`N`.md の詳細 (実装方針 / acceptance criteria) を未参照、着手時に scope 修正の必要あり -- **D-4 の re-pivot 経緯 (2026-05-13)**: 当初 D-4 = 順位 47 (`>` vs `>=` boundary lint) を予定していたが、着手直前 (memory rule `feedback_verify_task_not_already_done.md` 適用) で **PR #126 (commit `b677b9d4f54d`) で既に land 済 (`no-time-field-strict-greater` rule、custom-lint-rules.toml line 208-243)** を発見。D-5 から 順位 39 を D-4 に繰上げ、D-5 を 順位 56 + 119 bundle に再構成。stale todo7.md 順位 47 entry は同 PR の docs commit で削除 - -**D-4 dogfood outcome (Phase D Round 2 初の real lint_screen 観測、PR #150)**: - -PR #150 は同一 PR 内で **2 push event** が発生し、それぞれ独立した lint_screen dogfood data point を生成した: - -| Push event | commit | screen_decision | findings | fallback | num_ctx overflow | latency 推定 | -|---|---|---|---|---|---|---| -| 初回 push (D-4 impl) | `0c2cc07d` | **`informational`** | 0 | なし | なし | ~10-15s (pipeline 総 645s) | -| CR Major fix re-push | `1ec15686` | **`auto_fix`** | 1 (FP: TOML に Rust `unused-import` 誤検出) | なし | なし | ~10-15s (pipeline 総 583s) | - -**D-4 観測の意義**: - -1. **`informational` verdict の初観測**: D-3 (`auto_fix` + 1 FP) と異なる「指摘なし」経路を実証。lint_screen の判定空間 2 経路 (auto_fix / informational) を D-3 + D-4 で本セッション内にカバー、特定 verdict への偏りバイアスが無いことを確認 -2. **same-PR 2 push の independent dogfood**: CR Major fix re-push でも pipeline が独立に走り、新 data point を生成。Phase E 累積カウントへの直接寄与は 1 PR = 1 と数えるが、verdict variance 観測材料としては 2 data points として有効 -3. **CR Major auto-fix の構造的成功**: persona 直後の field 列挙不足 (`output_contracts` / `pass_previous_response` / `required_permission_mode` / `parallel`) を CR が指摘 → memory rule `feedback_review_severity_auto_fix.md` 適用で auto-fix → regression test 同梱 land。CR Minor は `resolved:` reply で auto-resolve (memory `project_coderabbit_auto_resolve.md`) -4. **post-merge-feedback 採用 3 件**: 順位 120 (rule comment + ADR-007 case study、Tier 1→3 reclassify) / 順位 121 (3 fields の individual fixture test 追加、Tier 2) / 順位 122 (`development-workflow.md` Step 0 への stale-entry 確認 step 追加、Tier 3) を `docs/todo8.md` に登録 + `docs/todo-summary.md` table 反映済 (commit 0c2cc07d-merged → 39ae2cd1) -5. **副産物 (D-4 セッション知見)**: post-merge-feedback analyzer の Tier 分類が誤りやすい構造を発見 (rule コメント追記を Tier 1 と分類) → memory `feedback_tier_classification.md` に正しい Tier 定義 (mechanical enforcement = T1 / docs 修正 = T3) を codify - -**D-5 dogfood outcome (Phase D Round 2 二件目の real lint_screen 観測、PR #TBD)**: - -D-4 と同様、D-5 も同一 PR 内で **2 push event** が発生し、それぞれ独立した lint_screen dogfood data point を生成: - -| Push event | commit | screen_decision | findings | fallback | num_ctx overflow | lint_screen latency | pipeline 総時間 | -|---|---|---|---|---|---|---|---| -| 初回 push (D-5 impl、~649 行 Rust diff) | `5cbed3c3` | **`auto_fix`** | 1 (FP: comment-lint-rust line 1 を `use std::io::Write;` 誤認、実 line 1 は `//!` doc comment) | なし | なし | 54s | 679s (takt review 5m 23s) | -| 2 回目 push (docs-only outcome record、~67 行 analysis.md 更新) | `9458660b` | **`auto_fix`** | 1 (同 FP 再現: docs-only diff にも関わらず Rust file hallucinate、構造的 root cause) | なし | なし | ~推定 30-50s | 522s (takt review 2m 44s、docs-only scope で executable criteria waived) | - -**D-5 観測の意義**: - -1. **`auto_fix` verdict 4 件目**: D-3 + D-4 CR fix + D-5 (2 push events) と同じ verdict 経路、false positive pattern も file/scope 混同で共通 (mistral:7b の構造的特徴) -2. **reviewer による cross-check の構造的成功**: simplicity-review が "Lint Screen Cross-Check" section で初回 finding を **明示的に false positive と判定** + 根拠 (line 1 直接読取 + use 文の実 location 特定 = `hooks-post-tool-linter` 側 line 1131/1163) を report に記載。Phase b' agreement 75% 設計通りに reviewer が独立判断する advisory consumption が functional -3. **docs-only diff でも同 FP 再現**: 2 回目 push は analysis.md ~67 行のみで Rust file の変更ゼロにも関わらず、mistral:7b が同じ FP を出力。**lint_screen の FP は diff 内容ではなく hook のソース全文を見て hallucinate している強い証拠** → mistral:7b の context window 内に hook source の周辺コードが含まれ、過去 commit の `use std::io::Write;` (test fn 内) を unused と推論。Phase b' scale-aware fixture では捕捉できない failure mode -4. **副産物 (D-5 セッション知見、production bug fix)**: UTF-8 漢字単独 test 着手時に `byte_offset_to_line` の char-boundary panic bug を発見 → 1-line fix で resolve、direct unit test も追加。AI 編集で multi-byte 文字で終わる `new_string` (例: 「漢字のみのコメント」末尾改行なし) を渡すと従来 hook が panic していたのを構造的に修正。test 拡充が production fault detection に直結した事例 -5. **lint_screen agreement の累積観測 (5 観測中 4 FP)**: D-3 / D-4 CR fix / D-5 (×2) はいずれも file-type / scope 混同型 FP で同 root cause 推定。Phase b' agreement 75% 想定からは過大な FP 率 (~80%) だが、severity が全て `minor` で reviewer cross-check による blocking なし → 運用 viable -6. **副産物 (D-5 push workflow 知見)**: 初回 push 後の outcome record 追記を「local @ in-place edit → split」で扱うと force-push 必要になる jj workflow gap を発見。代替策として `jj new @origin` で remote bookmark の child commit を直接作成 → FF push で advance する手順を実証。本 PR の 2 push 構成自体がこの workflow validation の dogfood - -**Phase D Round 1 完遂 + Round 2 D-4 + D-5 完遂後の Phase E 判定材料**: - -- ✅ pipeline integration works end-to-end (D-1 #144 smoke test + D-3 #148 + D-4 #150 + D-5 ×2 で計 5 real diff 完走) -- ✅ num_ctx 32768 で 67-649 行 diff overflow なし (Phase C reference values と整合、D-5 docs-only 67 行 〜 D-5 impl 649 行で size 帯拡大) -- ✅ fallback rate < 50% (D-3 0/1、D-4 initial 0/1、D-4 CR fix 0/1、D-5 ×2 0/2 = 累積 0/5 = 0%) -- ⚠️ agreement: 累積 false positive 4 件観測 (D-3 / D-4 CR fix / D-5 ×2) — いずれも `minor` severity で reviewer cross-check 通過、blocking なし。D-5 観測で「diff 外 context から hallucinate する failure mode」を新発見 -- ✅ verdict variance: `auto_fix` (D-3 + D-4 CR fix + D-5 ×2) と `informational` (D-4 initial) の 2 経路を観測 -- 🔄 **累積 PR data 充足中**: Round 1 (D-3) + Round 2 (D-4 + D-5) で **5 data points (3 PR)** 取得済、累積 5 PR (= ADR-038 採用条件) は **3 PR 段階で先行充足**。残 D-6/D-7 で更に観測予定 - -Phase E 着手の前提条件は **3-5 PR 累積 dogfood**。D-3 (1) + D-4 (1) + 残 D-5/D-6/D-7 (3 PR 計画) で計画上 **累積 5 PR** に到達する見込み。D-4 で「2 push event = 2 data points」が同 PR で発生する pattern を実証したため、Round 2 の残 PR でも CR fix 経由の追加観測が見込まれる。各 PR push 時に `$env:LINT_SCREEN_ENABLED=true` を opt-in で set し、`.takt/lint-screen-report.md` を post-push で記録する運用を継続。 +- **size 上限超過リスク**: M+M+XS が 800 行を超えた場合、c-1a (順位 63 単独) / c-1b (順位 64+67) の 2 PR 分割に switch (D-7 → D-7a/D-7b で 5 PR 拡張、Phase E 判定材料が 1 件増える方向で副次的に valid) +- **detail 見積もりの精度**: todo7.md (順位 63/64/67) の詳細を未参照、着手時に scope 修正の必要あり +- **num_ctx 32768 再 overflow**: D-3 (496 行) より大きい diff のため可能性あり、Phase A diagnostic log (`## Diagnostic` section) で即検知 **Phase D 計測手順** (各 PR 共通): @@ -361,46 +245,22 @@ Phase E 着手の前提条件は **3-5 PR 累積 dogfood**。D-3 (1) + D-4 (1) + 5. **post-push cleanup**: env var を unset (session 終了で自動消滅、commit には影響なし)、PR 作成 → CR review → merge 6. **3 PR 完了後**: 累積 fallback rate を集計 (num_ctx truncation / contract violation / 別問題 / 成功 で分類)、Phase D 基準 (<50% fallback) 達成判定、本 § Phase D row に dogfood outcome table 追加、Phase E 移行判断 -**想定リスク**: - -- **D-1 dogfood 不実施**: D-1 は ADR markdown のみで lint_screen が code lint findings を検出しない予測 (informational 0 件)。Phase D 前提整備 PR #144 で pipeline integration は smoke test 4 件で seal 済のため、D-1 skip による metrics ロスは限定的 -- **env var override 実装の D-2 への前出し**: D-2 (Rust test/comment mix) の scope に env var override (~30-50 行 Rust) が加わる。D-2 effort が S+S+S+S → S+S+S+M 程度に増加するが、PR sizing rule (250-800 行) 内に収まる予測 -- **D-3 (順位 102) のサイズ**: 250-350 行を超える可能性。L effort 化しても PR sizing rule (250-800 行) 内 -- **contract violation の再観測**: Phase C P-2 で `invalid severity: "error"` を観測した型崩壊系が Rust diff (D-2/D-3) で再発する可能性、Phase D scope 外として metrics 記録のみ -- **num_ctx 32768 再 overflow**: D-3 は P-3 (487 行) より小さいため発生しないはずだが、prompt の token 効率次第。Phase A diagnostic log (`## Diagnostic` section) で即検知 - -**別案 (棚上げ)**: D-1 を順位 110+111+104 (testing.md + docs-governance routing rule + ADR-007 amendment、mixed) に変更する案もあったが、ADR codify 優先で 112+113+114 を採用。 - -##### 🎯 Phase E: 採否判定 + retirement (1 PR、analysis.md 削除を含む、**Phase D Round 2 完遂後着手**) +##### 🎯 Phase E: 採否判定 + retirement (1 PR、**Phase D Round 2 完遂後着手**) -- **着手前提**: Phase D Round 2 (D-4〜D-7) 完遂 + 累積 5 PR 分の dogfood data 揃い + 各 PR の metrics (latency p50/p95 / fallback rate / classification 妥当性) 集計済 -- **採用 case**: ADR-038 を「採用」に昇格 + [docs/local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md) を削除 (試験運用ガイド役目終了) + 本 analysis.md を削除 + history.md は permanent record として保持判断 -- **却下 case**: cli-finding-classifier crate revert + ADR-038 を「却下」に更新 + Phase d guide 削除 + 本 analysis.md 削除 +- **着手前提**: D-7 完遂 + 累積 5 PR 分の dogfood data 揃い (D-6 時点で 4 PR / 6 data points 充足済) +- **採用 case**: ADR-038 を「採用」に昇格 + [docs/local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md) を削除 (試験運用ガイド役目終了) + 3 ファイル (`analysis.md` / `history.md` / `phase-d-outcomes.md`) を削除 (permanent value は ADR-038 へ migrate) +- **却下 case**: cli-finding-classifier crate revert + ADR-038 を「却下」に更新 + 同 3 ファイル + Phase d guide 削除 - **継続 case**: Phase D で別問題判明等 (例: real pipeline で classifier preview と異なる挙動) なら判定延期 + 本 §「次に何をするか」を再 pivot ##### Critical path 外 (並行 land 可、本 phase 完了を block しない) | Task | Effort | 関連 | |---|---|---| -| 順位 100-108 docs PR (8 entries の todo registration、bundle 1 PR で消化) | S | Phase A〜C と並行 land 可、commit chain 整理 | +| Bundle k 全 entry (順位 123-127、Phase D dogfood 由来の lint-screen FP 対策 + ADR-038 codify 等) | S+S+M+XS+XS | Phase D Round 2 で 4 PR 観測の構造的解消、優先実装 | | Bundle j-2 (順位 95+96、`.github/workflows/lint.yml` 新設) | M (S+M) | 独立 | | Bundle f-1/f-2 (PR #120 feedback) | S+M | 独立 | | 順位 110-114 (PR #142/#143 post-merge-feedback 採用分) | XS-S 各 | Phase D の対象 PR 候補としても活用可能 | -##### Dogfood signal log (旧 PR roster の preview 結果、Phase B/D の比較対象として保持) - -| PR | 構成 | Diff 行 | Latency | findings | fallback_reason | Cumulative fallback | -|---|---|---|---|---|---|---| -| #139 (旧 P-1) | Bundle h + g-2 (docs-only) | 337 | 23s | 0 | `JSON parse error: missing field 'screen_decision'` (line 94) | 1/1 = 100% | -| #140 (旧 P-2) | Bundle j-1 (TOML + Rust regex) | 203 | 46s | 0 | 同 (line 94 column 1) | 2/2 = 100% | -| #141 (旧 P-3) | Bundle d (Rust test only) | 187 | 11s | 0 | 同 (line 1 column 692) | **3/3 = 100%** | - -**観測**: (a) fallback rate 100% が 3 PR 連続 = 既に kill-switch 60% 超過、(b) latency variance (23s/46s/11s) は input size と弱相関 = mistral 内部状態 (cold/warm context) が支配的要因の仮説、(c) すべて同一 fallback_reason = 単一 root cause の可能性大。 - -**Phase d guide §3 kill-switch との関係**: ガイドは「real pipeline 経由で 3/5 fallback 観測 = 停止」と規定。本 preview は cli-finding-classifier 直叩きで pipeline 経由ではないが、3 連続 100% fallback は **厳密 kill-switch 超過に相当する severity**。Phase A〜C で repair しない限り Phase D に進めない判断。 - -**Out-of-roster dropouts**: 旧 P-3 = Bundle g-1 (順位 85+86) は PR #125 で land 済を P-3 着手時に発見 → roster 除外 + stale todo 削除。経緯詳細は `feedback_verify_task_not_already_done.md` 参照。 - 優先度低の独立 task (Phase d を block しない): - **§8.D**: classify mode の `normalized_issue` 言語制約強化 (low priority、ROI ★) - **§8.F**: PR body draft (§8.E 採用 = Phase d 完了 後) @@ -410,8 +270,11 @@ Phase E 着手の前提条件は **3-5 PR 累積 dogfood**。D-3 (1) + D-4 (1) + ## 関連リンク -- [local-llm-offload-history.md](local-llm-offload-history.md) — 完了済みの分析・実装・dogfood 計測・retrospective +- [local-llm-offload-phase-d-outcomes.md](local-llm-offload-phase-d-outcomes.md) — **Phase A〜D 各 PR の dogfood outcome / Phase E 判定材料 / Dogfood signal log** (本ファイルから 2026-05-13 分離) +- [local-llm-offload-history.md](local-llm-offload-history.md) — 旧計画 (§A-2 dogfood 等) + Phase a-c 以前の retrospective +- [local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md) — Phase D 着手時の運用ガイド - [ADR-038: ローカル LLM による CodeRabbit findings classification](adr/adr-038-local-llm-finding-classification.md) — 提案 2 (cli-finding-classifier) の land 結果、Phase a evals infrastructure の re-use 対象 +- [ADR-040: Local LLM Context Size と Resource Trade-off](adr/adr-040-local-llm-context-size.md) — Phase C `num_ctx 32768` の根拠 - [ADR-018: cli-pr-monitor の takt ベース移行と CronCreate 廃止](adr/adr-018-pr-monitor-takt-migration.md) - [ADR-020: takt facets (fix/supervise) の pre-push/post-pr 共通化戦略](adr/adr-020-takt-facets-sharing.md) - [ADR-034: CodeRabbit 監視・対話の自動化戦略 — Bundle a 設計根拠](adr/adr-034-coderabbit-auto-monitoring.md) diff --git a/docs/local-llm-offload-phase-d-outcomes.md b/docs/local-llm-offload-phase-d-outcomes.md new file mode 100644 index 0000000..87dae43 --- /dev/null +++ b/docs/local-llm-offload-phase-d-outcomes.md @@ -0,0 +1,190 @@ +# ローカル LLM オフロード — Phase A〜D 完了済み詳細記録 + +> **位置づけ**: [local-llm-offload-analysis.md](local-llm-offload-analysis.md) から完了済みの Phase A〜D の詳細 (Diagnostic / Root cause / Fix / Phase D 各 PR の dogfood outcome / Phase E 判定材料 / Dogfood signal log) を切り出した記録専用ファイル。`analysis.md` 軽量化 (50KB 接近回避) の一環として 2026-05-13 に分離。 +> +> **状態**: 試験運用 (analysis.md と同じ lifecycle、Phase D 採否判定 = ADR-038 採用/却下 確定で同時 retire) +> +> **引退条件**: 以下のいずれか (docs-governance.md retirement workflow 準拠、`analysis.md` と同時判断): +> +> - 残作業 (§8.D / §8.E / §8.F, §1 Phase b/c/d) が **すべて land または却下** → permanent value を ADR-038 に migrate → 3 ファイル (`analysis.md` / `history.md` / 本ファイル) 削除 +> - **6 ヶ月経過** (= 2026-11-08) しても §8.E 採否未決 → 3 ファイル削除 +> +> **参照元 (active)**: [local-llm-offload-analysis.md](local-llm-offload-analysis.md) の Phase A〜D 経過サマリーから本ファイルへリンク +> +> **本ファイルは記録専用**。次に何をするかは analysis.md 側を参照。 + +## 🚀 Phase A: Diagnostic ✅ **完了 (PR #142、2026-05-11)** + +**順位 98 実装完了** = `lib-ollama-client` の `generate_json` に `OllamaMetadata` (`prompt_eval_count` / `eval_count` / `num_ctx`) を組み込み、serde parse error 時に stderr へ warn log を emit する診断層を追加。`OllamaApi` trait の `generate_with_metadata` (default fallback あり、StubOllama は変更不要)、`emit_overflow_diagnostic` 関数で 90% 以上時に「num_ctx を増やす hint」を含める。16 unit test pass、cli-finding-classifier 経由でも warn log が stderr に出ることを smoke 確認。 + +## 🔍 Phase B: Root cause identification ✅ **完了 (Phase A 即時 dogfood、2026-05-11)** + +Phase A 実装後、PR #141 (P-3 = 187 行 mixed diff) を replay → **`prompt_eval_count: 8192 (vs num_ctx: 8192)` = 100% 到達を実機確認**。**真因 = num_ctx truncation で確定**。mistral の prompt が完全に context cap で truncate されて JSON output が完成せず `screen_decision` field 欠落の症状を引き起こしていた。仮説 2 候補 (num_ctx truncation / mistral 出力崩壊) のうち前者が真因と decisive 判定。 + +## 🔧 Phase C: Root cause fix ✅ **完了 (PR #143、2026-05-11)** + +`DEFAULT_NUM_CTX = 8192 → 16384` (initial) → 16384 でも 100% overflow を再観測 → `DEFAULT_NUM_CTX = 16384 → 32768` (mistral:7b theoretical max) に再増加。`lib_ollama_client` の lint test 17 件 pass、`cli-finding-classifier` evals 20 件 pass。副次的に `push-runner-config.toml` の `step_timeout = 180 → 600` に拡大 (num_ctx 増加で `cargo test -- --ignored` の 12 件 mistral invoke が long-running 化)。 + +**Phase C smoke dogfood** (32768 で 3 PRs replay): + +| PR | Lines | Latency | Old (8192) | **New (32768)** | +|---|---|---|---|---| +| P-1 (#139) | 414 | 48s | fallback (truncation) | ✅ `auto_fix` (real classification) | +| P-2 (#140) | 275 | 50s | fallback (truncation) | ⚠️ fallback (`invalid severity: error` = contract violation、num_ctx ではなく mistral semantic 精度の別問題) | +| P-3 (#141) | 487 | 55s | fallback (truncation) | ✅ `auto_fix` (real classification) | + +- **num_ctx truncation 起因 fallback: 3/3 → 0/3 (100% 解消)** ← Phase C 主目的を達成 +- **総合 fallback rate: 3/3 (100%) → 1/3 (33%)** ← **Phase D 基準 (<50%) を classifier preview で達成** +- 残り 1/3 は mistral 出力の contract violation (Phase b' agreement 75% で説明可能な semantic 精度問題、別 phase で対応 / Phase D scope 外) + +## 🛠️ Phase D 前提整備 (順位 109) ✅ **完了 (PR #144、2026-05-11)** + +`src/cli-push-runner/src/stages/lint_screen.rs` 改修: graceful fallback (exit 0) 時にも classifier stderr を `.takt/lint-screen-report.md` の `## Diagnostic` section に取込。Phase A 診断 warn log が **real pipeline 経由で visible** になる状態を確保。新 struct `ClassifierOutput { stdout, stderr }`、新 helper `render_diagnostic`、新規 smoke test 4 件 (TP / FP / edge case / parse-error path) で contract を seal。lint_screen tests 14/14 pass + workspace 全 cargo test pass。 + +## 🔄 Phase D Round 1 完遂 (D-1〜D-3、2026-05-12) + +Phase C fix + Phase D 前提整備 (順位 109) 完了で **real pipeline 経由 dogfood の必要十分条件が揃った**。D-1 着手時に session-only opt-in workflow が jj auto-snapshot と本質的に衝突する gap が判明したが、**順位 115 (`LINT_SCREEN_ENABLED` env var override) land で解消**。 + +### Round 1 対象 PR 構成 + +| Order | 構成 | Effort | 実 diff 行 | Diff Profile | 状態 | +|---|---|---|---|---|---| +| **D-1** ✅ | 順位 112 + 113 + 114 = ADR amendments bundle (ADR-038 eprintln scope / ADR-027 metrics override / 新規 ADR Local LLM context size) + 順位 115 backlog 化 | S+ | 298 (insert 228 / delete 70) | docs + 1 Rust comment | **PR #145 land 済 (2026-05-12)**、lint_screen dogfood は skip (workflow gap) | +| **D-2** ✅ | 順位 101 + 106 + 103 = lint rule code touch (rule⑧ edge case test / self-exclusion assertion / lint runner field comment) | S+S+S | 172 (insert 84 / delete 88) | Rust test/comment mix | **PR #146 land 済 (2026-05-12)**、lint_screen dogfood は skip (順位 115 未 land 時点) | +| **115** ✅ | `LINT_SCREEN_ENABLED` env var override (D-1 で発見した workflow gap 解消) | S | 325 (insert 268 / delete 57) | Rust impl + 10 tests + Phase D guide rewrite | **PR #147 land 済 (2026-05-12)**、D-3 着手 unblock | +| **D-3** ✅ | 順位 102 = `paths` filter を lint runner に実装 (impl + test、既存 rule⑧ migration は 順位 118 で trade-off 検討に保留) | M | 496 (insert 375 / delete 121) | Rust impl + 7 unit tests + globset 依存追加 + glob filter helper | **PR #148 land 済 (2026-05-12)、初の real lint_screen dogfood 観測** | + +**size ramp-up 設計**: small → mid → mid-large の漸増で、small PR 単体での fallback 観測と large PR で num_ctx 限界に近づく挙動を両方カバー。**D-1 / D-2 は workflow gap により lint_screen dogfood をスキップ、実質 metrics 観測は D-3 のみ**。 + +### D-1 / D-2 dogfood outcome (skip 理由 + 副産物) + +- lint_screen dogfood は実施せず (D-1 着手時の workflow gap が両 PR で持続) +- 副産物 (D-1): **workflow gap を systemic に発見 + 順位 115 を Tier 1 backlog 登録 + post-merge-feedback Tier 1 #1 で再 validate** +- 副産物 (D-1): ADR-040 内部不整合 (3.33x label vs `(num_ctx/8192)*180s` formula = 4x) は takt review 1 iter で検出 → fix で解消、post-merge-feedback Tier 3 #1 で sublinear clarification 採用 (順位 116) +- 副産物 (D-1): lib.rs L128-139 → ADR-040 移管 edit order を post-merge-feedback Tier 3 #3 で codify 採用 (順位 117) +- 副産物 (D-2): clean merge (post-merge-feedback 0 件採用)、feedback loop 正常動作を再確認 + +### D-3 dogfood outcome (Phase D 初の real lint_screen 観測、PR #148) + +| Metric | 観測値 | +|---|---| +| screen_decision | `auto_fix` | +| findings 件数 | 1 (minor severity) | +| finding 内容 | `unused-import` rule、`src/hooks-post-tool-linter/Cargo.toml:12` で `globset` を誤検出 | +| finding accuracy | **false positive** (takt reviewer が main.rs での import 使用済を diff verify で dismiss) | +| fallback_reason | なし (clean run、JSON parse error 無し) | +| `## Diagnostic` section | 不在 = num_ctx 32768 で overflow 発生せず (Phase A 診断 log emit せず) | +| lint_screen latency | 推定 ~80-120s (pipeline 総 628s − takt 248s − その他) | +| kill-switch (fallback > 50%) | fallback 0/1 = 0% → 基準内 | + +**D-3 観測の意義**: + +1. **env override 経路の実証**: PR #147 で実装した `LINT_SCREEN_ENABLED` env var で `[lint_screen] enabled = false` (TOML default) を override し、commit-free な session opt-in が成立 +2. **num_ctx 32768 の容量実証**: ~270 line Rust diff (Cargo.toml + main.rs + Cargo.lock + docs) を overflow せず完走、Phase A 診断 log も emit せず +3. **lint_screen が takt reviewer の context として活用**: reviewer 出力に「Lint-screen finding: false positive」と明示的に評価あり = advisory consumption が成立 +4. **1 false positive は Phase b' agreement 75% (= 25% disagreement) と整合**: 想定範囲内、複数 PR 累積評価が前提 +5. **副産物 (D-3 post-merge-feedback)**: `MAX_CUSTOM_VIOLATIONS` outer/inner loop break scope の explicit test 必要性を発見 (Tier 2-1 採用、順位 119)、rule⑧ への paths filter 適用範囲検討を順位 118 として backlog 化 + +## 🔄 Phase D Round 2 進行中 (D-4〜D-7、2026-05-13〜) + +Round 1 で実 dogfood data point が **1 件のみ** (D-3) に留まり、ADR-038 採用条件「5 PR 以上」+ analysis.md「3-5 PR 累積」前提との乖離が判明。**残 4 PR で Rust code 中心 + size ramp-up + 累積 5 PR (D-3 + D-4〜D-7) 達成** を狙う延長計画を策定 (D-1 反省 = docs-only 回避 / workflow gap 解消済確認)。 + +### Round 2 対象 PR 構成 + +| Order | 構成 | Tier / Effort | 実 diff 行 | Diff Profile | 状態 | +|---|---|---|---|---|---| +| **D-4** ✅ | 順位 39 単独 = takt workflow `model` 必須化 lint rule + 副次作業 + CR Major fix で 4 fields 追加 | T1 / S | 実 ~340 行 (commit 0c2cc07d + 1ec15686) | Rust lint rule (yaml multi-line regex) + 6+1 unit tests + custom-lint-rules.toml entry + 3 yaml site touch | **PR #150 merged 2026-05-13、初 real lint_screen 観測 2 data points** | +| **D-5** ✅ | 順位 56 + 119 bundle = comment-lint hook test 拡充 + `MAX_CUSTOM_VIOLATIONS` test + 副産物 `byte_offset_to_line` char-boundary panic bug fix | T2+T2 / S+S | 実 ~120 行 | comment-lint-rust + post-tool-linter test infra (UTF-8 5 + block boundary 6 + multi-rule MAX cap 2 + direct unit 1) | **PR #151 merged 2026-05-13、2 push events で 2 data points** | +| **D-6** ✅ | 順位 51 単独 = `.takt/review-diff.txt` を fix→review iteration 間で refresh (案 A takt hook 不可と判明 → 案 C fix.md instruction-level refresh に pivot) + Bundle k 順位 123-127 entry 登録 combined PR | T1 / M→S | 実 ~80 行 D-6 + Bundle k entry ~130 行 | takt facet instruction (markdown) + design docs (docs-only PR) | **PR #152 merged 2026-05-13、real lint_screen 1 data point** | +| **D-7** | Bundle c-1 (順位 63 + 64 + 67) = cli-merge-pipeline Drop guard / signal handler + orphan run reaper + ADR-030 spec amendment | T1×2 + T3 / M+M+XS | ~600-800 | Rust impl + signal trap + reaper logic + ADR markdown | 未着手 | + +**size ramp-up 設計 (Round 2)**: small → small-mid → mid → mid-large で num_ctx 32768 容量限界に向け漸増、各 size 帯で fallback 発生率 / Phase A diagnostic warn log 出力有無を観測。D-3 (mid, 496 行) と組合せて 5 size 帯をカバー。 + +**D-4 の re-pivot 経緯 (2026-05-13)**: 当初 D-4 = 順位 47 (`>` vs `>=` boundary lint) を予定していたが、着手直前 (memory rule `feedback_verify_task_not_already_done.md` 適用) で **PR #126 で既に land 済** を発見。D-5 から 順位 39 を D-4 に繰上げ、D-5 を 順位 56 + 119 bundle に再構成。stale todo7.md 順位 47 entry は同 PR の docs commit で削除。 + +### D-4 dogfood outcome (PR #150) + +PR #150 は同一 PR 内で **2 push event** が発生し、それぞれ独立した lint_screen dogfood data point を生成: + +| Push event | commit | screen_decision | findings | fallback | num_ctx overflow | latency 推定 | +|---|---|---|---|---|---|---| +| 初回 push (D-4 impl) | `0c2cc07d` | **`informational`** | 0 | なし | なし | ~10-15s (pipeline 総 645s) | +| CR Major fix re-push | `1ec15686` | **`auto_fix`** | 1 (FP: TOML に Rust `unused-import` 誤検出) | なし | なし | ~10-15s (pipeline 総 583s) | + +**D-4 観測の意義**: + +1. **`informational` verdict の初観測**: D-3 (`auto_fix` + 1 FP) と異なる「指摘なし」経路を実証。lint_screen の判定空間 2 経路 (auto_fix / informational) を D-3 + D-4 で本セッション内にカバー +2. **same-PR 2 push の independent dogfood**: CR Major fix re-push でも pipeline が独立に走り、新 data point を生成。Phase E 累積カウントへの直接寄与は 1 PR = 1 と数えるが、verdict variance 観測材料としては 2 data points として有効 +3. **CR Major auto-fix の構造的成功**: persona 直後の field 列挙不足を CR が指摘 → memory rule `feedback_review_severity_auto_fix.md` 適用で auto-fix → regression test 同梱 land +4. **post-merge-feedback 採用 3 件**: 順位 120 / 121 / 122 を `docs/todo8.md` に登録 +5. **副産物**: post-merge-feedback analyzer の Tier 分類が誤りやすい構造を発見 → memory `feedback_tier_classification.md` に正しい Tier 定義 (mechanical enforcement = T1 / docs 修正 = T3) を codify + +### D-5 dogfood outcome (PR #151) + +D-4 と同様、D-5 も同一 PR 内で **2 push event** が発生: + +| Push event | commit | screen_decision | findings | fallback | num_ctx overflow | lint_screen latency | pipeline 総時間 | +|---|---|---|---|---|---|---|---| +| 初回 push (D-5 impl、~649 行 Rust diff) | `5cbed3c3` | **`auto_fix`** | 1 (FP: comment-lint-rust line 1 を `use std::io::Write;` 誤認、実 line 1 は `//!` doc comment) | なし | なし | 54s | 679s (takt review 5m 23s) | +| 2 回目 push (docs-only outcome record、~67 行 analysis.md 更新) | `9458660b` | **`auto_fix`** | 1 (同 FP 再現: docs-only diff にも関わらず Rust file hallucinate) | なし | なし | ~30-50s | 522s (takt review 2m 44s) | + +**D-5 観測の意義**: + +1. **`auto_fix` verdict 4 件目**: D-3 + D-4 CR fix + D-5 (2 push events) と同じ verdict 経路、FP pattern も file/scope 混同で共通 +2. **reviewer による cross-check の構造的成功**: simplicity-review が "Lint Screen Cross-Check" section で finding を **明示的に false positive と判定** + 根拠を report に記載 +3. **docs-only diff でも同 FP 再現**: 2 回目 push は analysis.md ~67 行のみで Rust file の変更ゼロにも関わらず、mistral:7b が同じ FP を出力。**lint_screen の FP は diff 内容ではなく hook のソース全文を見て hallucinate している強い証拠** +4. **副産物 (production bug fix)**: UTF-8 漢字単独 test 着手時に `byte_offset_to_line` の char-boundary panic bug を発見 → 1-line fix で resolve、direct unit test も追加 +5. **lint_screen agreement の累積観測 (5 観測中 4 FP)**: いずれも file-type / scope 混同型 FP で同 root cause 推定、severity 全て `minor` で reviewer cross-check による blocking なし → 運用 viable +6. **副産物 (push workflow 知見)**: `jj new @origin` で remote bookmark の child commit を直接作成 → FF push で advance する手順を実証 + +### D-6 dogfood outcome (PR #152) + +D-6 は当初想定 (案 A = takt workflow hook) から **案 C = fix.md instruction-level refresh** への pivot を経て、docs-only PR として land。同時に Bundle k 順位 123-127 の entry 登録も含めた combined PR。push event は 1 回のみ (CR review が Nitpick のみで user 判断で auto-merge): + +| Push event | commit | screen_decision | findings | fallback | num_ctx overflow | lint_screen latency | pipeline 総時間 | +|---|---|---|---|---|---|---|---| +| 初回 push (D-6 impl + Bundle k entry、~210 行 docs-only diff) | `520ac0bb` | **`auto_fix`** | 1 (FP: `docs/local-llm-offload-analysis.md` line 1 を `use std::io::Write;` 誤認、D-5 と同 root cause) | なし | なし | ~30-50s 推定 | 510s (takt review 2m 48s、1 iter で APPROVE) | + +**D-6 観測の意義**: + +1. **`auto_fix` verdict 5 件目**: D-3 + D-4 CR fix + D-5 ×2 + D-6 で計 5 観測。docs-only diff (本 PR は markdown のみ) でも `auto_fix` 判定 + 同型 `unused-import` FP が一貫して再現 — mistral:7b の context window 内に hook source が含まれて hallucinate する pattern を **5 観測目** として裏付け +2. **本 PR の改修内容の direct dogfood は未達成**: takt review が 1 iter で APPROVE のため、fix step の `jj diff -r @ > .takt/review-diff.txt` instruction が実行される機会なし。本改修の execution rate / 効果検証は後続 PR (fix iteration が発生する PR) に持ち越し +3. **reviewer cross-check の構造的成功 (D-5 と同パターン)**: simplicity-review が "Lint Screen Cross-Check" で lint_screen finding を **明示的に false positive と判定** (line 1 が冒頭 markdown 見出しであることを直接読取 + use 文の不在を確認) +4. **post-merge-feedback 4 件採用 → すべて Bundle k 既存エントリと完全重複**: analyzer 自身が "Bundle k 優先度 123 で既に roadmap 済" と明記 → 新規順位を追加せず既存 4 entries (順位 123/124/126/127) に PR #152 を追加観測として追記 (Frequency 観測: 3 PR → 4 PR に更新) +5. **設計判断 pivot (案 A→案 C) のメタ知見**: takt v0.35.3 schema を直接参照 (`piece-types.d.ts` / `runtime-environment.js`) して案 A 不可と確定 → advisor 相談で案 C 採用 (既存 Bundle Z #B-β `fix-metrics-check.ps1` invocation と同形 precedent)。framework capability の不確実性は **実装前の schema/source 直接確認** で解消可能 +6. **副産物 (push workflow 知見)**: 2 つの独立タスク (Bundle k entry 登録 + D-6 impl) が working copy に混在した状態から `jj split` で 2 commit に分離 + 1 PR で push という pattern を実証 (PR 分割せず commit のみ分離) + +## 📊 Phase D Round 1 + Round 2 (D-4/D-5/D-6) 完遂後の Phase E 判定材料 + +- ✅ pipeline integration works end-to-end (D-1 #144 smoke test + D-3 #148 + D-4 #150 + D-5 ×2 + **D-6 #152** で計 6 real diff 完走) +- ✅ num_ctx 32768 で 67-649 行 diff overflow なし (Phase C reference values と整合、D-5 docs-only 67 行 〜 D-5 impl 649 行で size 帯拡大、D-6 docs-only 210 行で再確認) +- ✅ fallback rate < 50% (D-3 0/1、D-4 initial 0/1、D-4 CR fix 0/1、D-5 ×2 0/2、**D-6 0/1** = 累積 0/6 = 0%) +- ⚠️ agreement: 累積 false positive **5 件観測** (D-3 / D-4 CR fix / D-5 ×2 / **D-6**) — いずれも `minor` severity で reviewer cross-check 通過、blocking なし。D-5 / D-6 観測で「diff 外 context から hallucinate する failure mode」が docs-only diff でも reproducible と確定 = Bundle k 順位 123 (MD 除外フィルター) の構造的解消対象 +- ✅ verdict variance: `auto_fix` (D-3 + D-4 CR fix + D-5 ×2 + D-6) と `informational` (D-4 initial) の 2 経路を観測 +- ✅ **累積 PR data 充足完了**: Round 1 (D-3) + Round 2 (D-4 + D-5 + D-6) で **6 data points (4 PR)** 取得済、累積 5 PR (= ADR-038 採用条件) は **4 PR 段階で先行充足**。残 D-7 で 5+ PR に到達予定 + +Phase E 着手の前提条件 **3-5 PR 累積 dogfood** は D-6 完遂時点で **既に充足** (4 PR / 6 data points)。D-7 (Bundle c-1) 完遂後に Phase E (採否判定) に移行可能な状態。 + +## 📝 Dogfood signal log (旧 PR roster の preview 結果、Phase B/D 比較対象) + +cli-finding-classifier 直叩き (pipeline 経由ではない) の preview 結果。Phase A〜C を triggerした 100% kill-switch 観測の原典: + +| PR | 構成 | Diff 行 | Latency | findings | fallback_reason | Cumulative fallback | +|---|---|---|---|---|---|---| +| #139 (旧 P-1) | Bundle h + g-2 (docs-only) | 337 | 23s | 0 | `JSON parse error: missing field 'screen_decision'` (line 94) | 1/1 = 100% | +| #140 (旧 P-2) | Bundle j-1 (TOML + Rust regex) | 203 | 46s | 0 | 同 (line 94 column 1) | 2/2 = 100% | +| #141 (旧 P-3) | Bundle d (Rust test only) | 187 | 11s | 0 | 同 (line 1 column 692) | **3/3 = 100%** | + +**観測**: (a) fallback rate 100% が 3 PR 連続 = 既に kill-switch 60% 超過、(b) latency variance (23s/46s/11s) は input size と弱相関 = mistral 内部状態 (cold/warm context) が支配的要因の仮説、(c) すべて同一 fallback_reason = 単一 root cause の可能性大 → Phase B で確定 (num_ctx truncation)。 + +**Phase d guide §3 kill-switch との関係**: ガイドは「real pipeline 経由で 3/5 fallback 観測 = 停止」と規定。本 preview は cli-finding-classifier 直叩きで pipeline 経由ではないが、3 連続 100% fallback は **厳密 kill-switch 超過に相当する severity**。Phase A〜C で repair しない限り Phase D に進めない判断 → Phase C fix 後の real pipeline dogfood (D-3〜D-6) で fallback 0/6 = 0% を実証して解消。 + +**Out-of-roster dropouts**: 旧 P-3 = Bundle g-1 (順位 85+86) は PR #125 で land 済を P-3 着手時に発見 → roster 除外 + stale todo 削除。経緯詳細は `feedback_verify_task_not_already_done.md` 参照。 + +## 関連リンク + +- [local-llm-offload-analysis.md](local-llm-offload-analysis.md) — 現在の active 実行計画 (D-7 plan / Phase E 判定 / 残作業) +- [local-llm-offload-history.md](local-llm-offload-history.md) — Phase a-c 以前の analysis / 旧計画 retrospective +- [local-llm-offload-phase-d-guide.md](local-llm-offload-phase-d-guide.md) — Phase D 着手時の運用ガイド +- [ADR-038: ローカル LLM による CodeRabbit findings classification](adr/adr-038-local-llm-finding-classification.md) +- [ADR-040: Local LLM Context Size と Resource Trade-off](adr/adr-040-local-llm-context-size.md)