Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
be1cd02
Docs: cross-refactoring 修正後の再検証の実行条件を記録
takemi-ohama Aug 16, 2026
df445e8
Refactor: extract_method — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
d191967
Refactor: extract_method — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
d3a34bc
Refactor: extract_method — metrics.py#aggregate
takemi-ohama Aug 16, 2026
ef8970c
Refactor: extract_method — metrics.py#aggregate
takemi-ohama Aug 16, 2026
17a1b8c
Refactor: extract_method — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
5a6d1d6
Refactor: extract_method — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
a8ed8ce
Test: monitor_agent の終了判定を現状固定
takemi-ohama Aug 16, 2026
0661832
Refactor: extract_method — monitor.py#monitor_agent
takemi-ohama Aug 16, 2026
64882a9
Refactor: extract_method — monitor.py#monitor_agent
takemi-ohama Aug 16, 2026
a1e3186
Refactor: consolidate_duplication — refactor.py#commit_validation
takemi-ohama Aug 16, 2026
b981a06
Refactor: consolidate_duplication — refactor.py#range_recovery
takemi-ohama Aug 16, 2026
8fad6dd
Revert "Refactor: consolidate_duplication — refactor.py#range_recovery"
takemi-ohama Aug 16, 2026
5cadf52
Revert "Refactor: consolidate_duplication — refactor.py#commit_valida…
takemi-ohama Aug 16, 2026
e7ea3e4
Revert "Refactor: extract_method — monitor.py#monitor_agent"
takemi-ohama Aug 16, 2026
c60a4a4
Revert "Refactor: extract_method — monitor.py#monitor_agent"
takemi-ohama Aug 16, 2026
53be342
Revert "Test: monitor_agent の終了判定を現状固定"
takemi-ohama Aug 16, 2026
ea2e4a4
Revert "Refactor: extract_method — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
8d29a6f
Revert "Refactor: extract_method — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
f21f96c
Revert "Refactor: extract_method — metrics.py#aggregate"
takemi-ohama Aug 16, 2026
7aa2c10
Revert "Refactor: extract_method — metrics.py#aggregate"
takemi-ohama Aug 16, 2026
675e0a1
Revert "Refactor: extract_method — refactor.py#cmd_merge_apply"
takemi-ohama Aug 16, 2026
8933442
Revert "Refactor: extract_method — refactor.py#cmd_merge_apply"
takemi-ohama Aug 16, 2026
4150848
Refactor: extract_method — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
3c983da
Refactor: extract_method — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
b5ea994
Refactor: extract_method — metrics.py#aggregate
takemi-ohama Aug 16, 2026
61d2bd4
Refactor: extract_method — metrics.py#aggregate
takemi-ohama Aug 16, 2026
cfd7e62
Refactor: extract_method — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
3388260
Refactor: extract_method — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
b4b0576
Refactor: consolidate_duplication — refactor.py#commit_validation
takemi-ohama Aug 16, 2026
cebd1ef
Refactor: consolidate_duplication — refactor.py#range_recovery
takemi-ohama Aug 16, 2026
8ae5758
Chore: 生成物を同期する(進行側)
claude Aug 16, 2026
48f2ac9
Refactor: extract_method — monitor.py#monitor_agent (characterization…
takemi-ohama Aug 16, 2026
d5cae7c
Refactor: extract_method — monitor.py#monitor_agent
takemi-ohama Aug 16, 2026
d390be7
Refactor: extract_method — monitor.py#monitor_agent
takemi-ohama Aug 16, 2026
674086e
Refactor: extract_method — monitor.py#monitor_agent
takemi-ohama Aug 16, 2026
9aaab34
Refactor: split_into_pipeline — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
c932282
Refactor: split_into_pipeline — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
7f531cc
Refactor: split_into_pipeline — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
ec9caf5
Refactor: split_into_pipeline — refactor.py#cmd_merge_fix
takemi-ohama Aug 16, 2026
6ffb038
Refactor: split_into_pipeline — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
ef60c87
Refactor: split_into_pipeline — refactor.py#cmd_merge_apply
takemi-ohama Aug 16, 2026
f9247da
Refactor: consolidate_duplication — refactor.py#verify_apply_item
takemi-ohama Aug 16, 2026
9fd4546
Refactor: introduce_parameter_object — refactor.py#_verify_and_record…
takemi-ohama Aug 16, 2026
2c72426
Revert "Refactor: introduce_parameter_object — refactor.py#_verify_an…
takemi-ohama Aug 16, 2026
c8377fe
Revert "Refactor: consolidate_duplication — refactor.py#verify_apply_…
takemi-ohama Aug 16, 2026
73d3276
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_apply"
takemi-ohama Aug 16, 2026
e476f59
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_apply"
takemi-ohama Aug 16, 2026
bf9d2d4
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
3c18154
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
b44d1c9
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
d468f4d
Revert "Refactor: split_into_pipeline — refactor.py#cmd_merge_fix"
takemi-ohama Aug 16, 2026
aca1783
Revert "Refactor: extract_method — monitor.py#monitor_agent"
takemi-ohama Aug 16, 2026
45064e1
Revert "Refactor: extract_method — monitor.py#monitor_agent"
takemi-ohama Aug 16, 2026
f858949
Revert "Refactor: extract_method — monitor.py#monitor_agent"
takemi-ohama Aug 16, 2026
d69c5e8
Revert "Refactor: extract_method — monitor.py#monitor_agent (characte…
takemi-ohama Aug 16, 2026
7006f59
Docs: 修正後の再検証の結果を記録
claude Aug 16, 2026
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
187 changes: 187 additions & 0 deletions issues/issue-113-cross-refactoring-retrial.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
# cross-refactoring 修正後の再検証

不具合 9 件の修正([issue-113-cross-refactoring-defect-fixes.md](issue-113-cross-refactoring-defect-fixes.md)、
NDF v8.2.0)を実機で確かめる。**この Pull Request がその対象**である。

前回(PR #118)は適用結果の検証で失敗した項目を取り消す経路が破綻し、
レビューフェーズより先へ一度も進めなかった。今回の目的は**その先を通すこと**にある。

## 実行条件

| 項目 | 値 |
| --- | --- |
| ホスト | Claude Code(提案・レビューには不参加) |
| 提案・レビュー | codex / gemini / kiro |
| 適用の母集合 | claude / codex / kiro |
| 使用する版 | リポジトリ内の `plugins/ndf-claude`(v8.2.0)。プラグインキャッシュ(8.1.0)は使わない |
| ラウンド上限 | 3 |

```bash
PLUGIN_ROOT=/work/ai-plugins/plugins/ndf-claude

/ndf:cross-refactoring <この PR 番号> \
--scope plugins/ndf-shared/skills/cross-refactoring/scripts \
plugins/ndf-shared/skills/cross-refactoring/tests \
plugins/ndf-shared/skills/cross-review/scripts/lib \
--baseline-test "uv run --with pytest python -m pytest \
plugins/ndf-shared/skills/cross-refactoring/tests \
plugins/ndf-shared/skills/cross-review/tests -q"
```

`--scope` に**テストの置き場所を含める**。範囲は適用結果の検証にも効くようになったため、
含めないと `test_gap` が真の項目で「テストを先に足せ」と「範囲外を触るな」が両立しない。

## 確かめること

修正した 9 件が実機で成立するか。

| # | 直したこと | 何が観測できれば通ったと言えるか |
| --- | --- | --- |
| 1 | 取り消しの巻き戻しと積み直し | 検証に失敗した項目だけが消え、合意済みの項目が残る。分離できない位置関係なら `rounds[].drops[].mode = round` が記録される |
| 2 | 中断と全件失敗の区別 | 取り消しに失敗したら終了コード 4 で進行が止まる(次の提案ラウンドへ進まない) |
| 3 | 判定の逐次記録 | `rounds[].apply_progress` に項目ごとの判定が残る |
| 4 | 再送信の印 | 取り消しが Pull Request へ反映される。`pending_push` が残らない |
| 5 | 範囲の検査 | 配布物 3 系統が実装担当の差分に現れない |
| 6 | 提案結果のラウンド別保存 | `<ランタイム>-propose-rf<ID>-r<ラウンド>-result.json` が巡ごとに残る |
| 7 | gemini の読み取り | gemini の提案が語彙内で返る(`read_file` が拒否されない) |
| 8 | 語彙の列挙 | 3 ランタイムとも `smell` / `technique` が英字の識別子で返る |
| 9 | 認証の確認 | 初期化時に 4 CLI の認証状態が出力される |

## 前回まったく実行できていない範囲

ここを通すことが今回の主目的である。

- レビュー担当 2 者の並列実行と指摘の投稿、承認判定
- 指摘の修正と再レビューの繰り返し、上限到達時の項目単位の見送り
- 実装担当の輪番
- 提案の重複率による収束判定
- 集計値(`report --metrics`)の出力

## 結果

**修正した 9 件はすべて実機で成立した。** 前回は適用結果の検証で失敗した項目を取り消す
経路が破綻して停止したが、今回はレビュー・判定・輪番・集計まで到達した。
一方で**新しい不具合を 2 件見つけ**、うち 1 件は収束ループを実質的に不能にする。

## 到達点

```mermaid
flowchart TD
Init([初期化・作業ディレクトリ・手順書配置]):::ok --> P1
P1["R1 提案(3 CLI 並列)11 件"]:::ok --> M1
M1["統合 7 件 → 採用 5 件"]:::ok --> A1
A1["R1 適用(codex)11 コミット"]:::ok --> V1
V1["検証: 採用 4 / 失敗 1"]:::ok --> D1
D1["取り消し 11 → 積み直し 8<br/>(項目単位)"]:::ok --> RV1
RV1["R1 レビュー(gemini + kiro)<br/>両者 APPROVE"]:::ok --> P2
P2["R2 提案 → 採用 5 件"]:::ok --> A2
A2["R2 適用(kiro)12 コミット"]:::ok --> V2
V2["検証: 全 5 件が範囲外で失敗"]:::ng --> D2
D2["取り消し 12 → 積み直し 0<br/>ラウンドごと失敗"]:::ok --> Stop
Stop["不具合 10 のため中止"]:::ng

classDef ok fill:#dfd,stroke:#383
classDef ng fill:#fdd,stroke:#933
```

前回の到達点は `V1` の直前までだった。

## 修正 9 件の実機確認

| # | 直したこと | 実機での観測 |
| --- | --- | --- |
| 1 | 取り消しの巻き戻しと積み直し | `取り消し 11 コミット / 積み直し 8 コミット(項目単位)`。失敗した 1 項目だけを落とし、**同じ `refactor.py` を触る 3 項目 6 コミットを積み直した** |
| 2 | 中断と全件失敗の区別 | push 失敗で終了コード 4。次の提案ラウンドへ進まず停止した |
| 3 | 判定の逐次記録 | `rounds[].apply_progress` に全項目の判定が残った |
| 4 | 再送信の印 | 中断を跨いで `pending_push` が残り、次の実行が**処理済み判定より先に** push を再送した |
| 5 | 範囲の検査 | 範囲外コミットを検出して項目を失敗にした(R1-004 / R2 全件) |
| 6 | 提案結果のラウンド別保存 | `*-propose-rf120-r1-result.json` と `-r2-` が**両方残った** |
| 7 | gemini の手順書読み取り | `.gemini/settings.json` が配置され、差分にも出なかった |
| 8 | 語彙の列挙 | 3 ランタイムとも `smell` / `technique` を英字の識別子で返した |
| 9 | 認証の確認 | 初期化時に 4 CLI の認証状態を出力した |

不具合 1 は、**前回破綻したのと同じ条件**(採用項目の多くが同一ファイルを触る)で成立した。

## 前回まったく実行できていなかった範囲

| 対象 | 結果 |
| --- | --- |
| レビュー担当 2 者の並列実行と承認判定 | ✅ gemini / kiro を並列起動し、両者 `APPROVE` で `judge-review` が終了コード 0 |
| 実装担当の輪番 | ✅ R1 codex → R2 kiro。レビュー担当も gemini+kiro → codex+gemini へ入れ替わった |
| 提案ラウンドの収束判定 | ✅ `advance` が継続を判定 |
| 集計値の出力 | ✅ `report --metrics` が実装担当・レビュー担当の表と、`auto` モデルの分離注記まで出した |
| 指摘の修正と再レビューの繰り返し | ❌ **未到達**。R1 は指摘 0 件、R2 は適用が全件失敗したため |
| 上限到達時の項目単位の見送り | ❌ **未到達**(同上) |

## 新しく見つかった不具合

### 10. pre-push の同期検査と範囲ルールが両立しない

このリポジトリは `.githooks/pre-push` で生成物の同期を検査する。一方この Skill は
「実装担当は編集元だけを触る / 生成物の同期は**進行側が収束後に**まとめて行う」と決めた。
この 2 つは両立しない。

```console
$ git push origin refactor/cross-refactoring-retrial
Generated directory is out of date: plugins/ndf-claude/skills
exited 1
```

**実装担当の push も、取り消しを反映する進行側の push も落ちる。** 結果、検証を通って
いない R1-004 の変更が Pull Request に残った(取り消しはローカルのみ)。
**不具合 4 が防ごうとした状態そのもの**である。

さらに悪いことに、**この検査は実装担当を範囲ルール違反へ誘導する。** ラウンド 2 で
kiro は push を通すために配布物 3 系統を同期し、その結果**採用 5 件が全件範囲外で失敗**
して 1 ラウンドを丸ごと失った。

| ラウンド | 実装担当 | 配布物を同期したか | 適用成功 |
| --- | --- | --- | ---: |
| 1 | codex | しなかった(push は失敗のまま放置) | 4 / 5 |
| 2 | kiro | した(4 コミットすべてで) | 0 / 5 |

「収束後にまとめて同期する」という決定が、**ループの途中で push が起きること**を
見落としていた。

**修正の方向**: 実装担当に push させず、**検証を通った後で進行側だけが push する**。
同期はその直前に行う(`--sync-command` を新設し、状態ファイルへ保持する)。
これで「未検証の変更が公開される」経路自体が無くなり、不具合 4 は緩和ではなく根絶できる。

本再検証では、進行側が生成物を同期するコミットを積んで回避した。

### 11. 適用で失敗した項目が「対象外」に入らない

手順書は「見送った項目は理由付きで記録し、次ラウンドの提案時に**対象外として渡す**。
そうしないと同じ提案が毎ラウンド出続けて収束しない」と定めている。しかし
`merge-apply` の失敗経路だけがこの記録を行わない(`deferred_items` に入らない)。

実測では、ラウンド 1 で失敗した `monitor.py#monitor_agent`(R1-004)が
**3 ランタイム全員から再提案され、合意 3 で最優先に採用された**(R2-001)。
同じ理由で必ず失敗するため、ラウンドを 1 つ丸ごと消費する。

**修正の方向**: `merge-apply` が失敗させた項目も `deferred_items` へ理由付きで記録する。

## 運用上の注意

`--scope` には、範囲内の各ソースに対応する**テストの置き場所をすべて**含める。
今回は `cross-review/scripts/lib` を範囲に入れながら `cross-review/tests` を入れ忘れた
ため、`monitor.py` の現状固定テストが範囲外となり R1-004 が失敗した。
**検査は正しく働いている**(指定の誤り)。

## この Pull Request に残ったもの

ラウンド 1 で採用・検証・レビュー承認まで通った 4 項目が残る。

| ID | 対象 | 手法 |
| --- | --- | --- |
| R1-001 | `refactor.py#cmd_merge_apply` | `extract_method` |
| R1-002 | `metrics.py#aggregate` | `extract_method` |
| R1-003 | `refactor.py#cmd_merge_fix` | `extract_method` |
| R1-005 | `refactor.py#cmd_merge_apply` | `consolidate_duplication` |

ラウンド 2 の 12 コミットは全件取り消し済み。テストは 430 件成功し、生成物も同期済みである。

## 次にすること

不具合 10 と 11 を直してから、**指摘の修正と再レビューの繰り返し**を通す再々検証を行う。
不具合 10 を直さない限り、生成物を持つリポジトリでは収束ループが成立しない。
Loading
Loading