何を見つけたか
cross-review を --only codex で 1 者だけにして回すと、codex が REQUEST_CHANGES で新しい指摘を投稿したラウンドでも、judge が収束と判定する(ndf 10.10.1、2026-09-13)。
$ state.py read-result <PR> codex
✅ codex: intent=REQUEST_CHANGES posted_as=COMMENT comments=1
$ critique-round.sh <PR> 1 codex
⏭ codex: 反証の対象がありません(すべて自分の指摘)
✅ 反証を取り込みました: 0 件
$ state.py judge <PR>; echo $?
✅ 新しい指摘が出なくなった。収束。
REVIEWER_INTENTS='codex=REQUEST_CHANGES'
NEW_FINDINGS=0
0
同じ現象を 4 ラウンドで観測した。どのラウンドの指摘も、それまでに無い箇所・観点で、修正を要する妥当なものだった(契約に TTL が無い、フラグの効果が未定義、再実行で復旧できない など)。
原因の見当
_new_finding_count(plugins/ndf/skills/cross-review/scripts/state.py:3718)は、証拠集約を通ったラウンド(_evidence_completed)では _counted_finding_keys(:3674)で数える指摘を絞る。--only で担当が 1 者だと、反証する他の担当がいないため数える区分に入る指摘が 0 件になり、_evaluate_convergence(:2848)の findings_measurable and new_findings == 0 が真になる。
証拠集約の印は反証の有無に関わらず付く。 critique-round.sh が「反証の対象がありません」になると、cmd_collect_critiques では揃っていない対象(missing)が空になり、末尾の _mark_evidence_round(:3199)がラウンドに印を付ける。
状態ファイルを最小の形で組み、関数を直接呼んだ再現(--only codex、証拠付きの major 1 件、印の付いたラウンド 1):
new_finding_count (0, True) classification insufficient_evidence
round_passes False converged True
反証する担当が構造的にいない指摘
--only に限らず、次の指摘も同じ形で数えられず、収束へ進む。
| 形 |
なぜ反証する担当がいないか |
--only で担当が 1 者 |
反証する他の担当がいない |
| 同じラウンドで起動し直した担当の指摘 (#583) |
印は 1 回目の経路で反証を取り込んだ時点で付く。起動し直した担当の指摘はその後に取り込まれ、反証の対象にならない |
担当 2 者で、相手が反証で support を返さない指摘を数えないのは #156 の設計どおりであり、この課題の対象外である。
どこで見つけたか
agy がハードタイムアウトで結果を残せず(#598)、状態ファイルを退避して --only codex で初期化し直し、1 ラウンドずつ回していたとき。
#598 は v10.13.0(2026-09-16)で解決した。 監視の上限は工程ごとの表
(plugins/ndf/scripts/lib/limits.py)が持ち、レビューの工程は 1200 秒になった。この課題の成立には
影響しない。 --only で 1 者へ絞る経路は残り、絞り込みの仕組みも変わっていない。
直さないと何が起きるか
期待する振る舞いの候補
| 候補 |
内容 |
| 反証の担当がいないラウンドは絞り込まない |
反証が 0 件のときは全件を数える(_evidence_completed を偽に扱う) |
--only では intent に従う |
担当が 1 者なら、全員 pass(round_passes)だけを収束の条件にする |
| 印を指摘単位で持つ |
証拠集約の印をラウンド単位ではなく指摘単位(反証の対象になったか)で持ち、反証の対象にならなかった指摘は絞り込まない。#583 の起動し直しの経路もまとめて塞がる |
関連
進行
モード: standard / 作業ツリー: .worktrees/feat/issue-732-uncounted-classification / 計画: issues/issue-732-624-706-plan.md
閉じた理由
PR #790 で直り、ndf 10.16.0(2026-09-22、main / タグ ndf--v10.16.0、PR #810)で配布した。リリース後テスト(#810 (comment) )でこの課題の受け入れ条件はすべて合格した。
振り返り: #810 (comment)
何を見つけたか
cross-reviewを--only codexで 1 者だけにして回すと、codex がREQUEST_CHANGESで新しい指摘を投稿したラウンドでも、judgeが収束と判定する(ndf 10.10.1、2026-09-13)。同じ現象を 4 ラウンドで観測した。どのラウンドの指摘も、それまでに無い箇所・観点で、修正を要する妥当なものだった(契約に TTL が無い、フラグの効果が未定義、再実行で復旧できない など)。
原因の見当
_new_finding_count(plugins/ndf/skills/cross-review/scripts/state.py:3718)は、証拠集約を通ったラウンド(_evidence_completed)では_counted_finding_keys(:3674)で数える指摘を絞る。--onlyで担当が 1 者だと、反証する他の担当がいないため数える区分に入る指摘が 0 件になり、_evaluate_convergence(:2848)のfindings_measurable and new_findings == 0が真になる。証拠集約の印は反証の有無に関わらず付く。
critique-round.shが「反証の対象がありません」になると、cmd_collect_critiquesでは揃っていない対象(missing)が空になり、末尾の_mark_evidence_round(:3199)がラウンドに印を付ける。状態ファイルを最小の形で組み、関数を直接呼んだ再現(
--only codex、証拠付きの major 1 件、印の付いたラウンド 1):反証する担当が構造的にいない指摘
--onlyに限らず、次の指摘も同じ形で数えられず、収束へ進む。--onlyで担当が 1 者担当 2 者で、相手が反証で support を返さない指摘を数えないのは #156 の設計どおりであり、この課題の対象外である。
どこで見つけたか
agy がハードタイムアウトで結果を残せず(#598)、状態ファイルを退避して
--only codexで初期化し直し、1 ラウンドずつ回していたとき。#598 は v10.13.0(2026-09-16)で解決した。 監視の上限は工程ごとの表
(
plugins/ndf/scripts/lib/limits.py)が持ち、レビューの工程は 1200 秒になった。この課題の成立には影響しない。
--onlyで 1 者へ絞る経路は残り、絞り込みの仕組みも変わっていない。直さないと何が起きるか
--onlyで回すと、最初のラウンドで必ず収束する。指摘は投稿されるが、修正の工程(fix)へ回らず、最終スイープまで放置される--onlyを使うと、この誤った収束を踏む期待する振る舞いの候補
_evidence_completedを偽に扱う)--onlyでは intent に従うround_passes)だけを収束の条件にする関連
insufficient_evidenceになる。収束の誤りの部分は同じ仕組みで、一緒に直すinsufficient_evidenceへ落ち、未解決の指摘を残したまま approved になる。絞り込みの直し方が重なる。 どちらも_counted_finding_keysの区分(COUNTED_CLASSIFICATIONS、state.py:3431)を通らない指摘が数から落ちる形である進行
モード: standard / 作業ツリー:
.worktrees/feat/issue-732-uncounted-classification/ 計画:issues/issue-732-624-706-plan.md閉じた理由
PR #790 で直り、ndf 10.16.0(2026-09-22、
main/ タグndf--v10.16.0、PR #810)で配布した。リリース後テスト(#810 (comment) )でこの課題の受け入れ条件はすべて合格した。振り返り: #810 (comment)