## 何を見つけたか cross-review の round 1 で、codex が起動 15 秒後に `EARLY_ERROR`・理由 `usage_limit` と判定され、「起動し直しても解けない理由」として駆動が中断した(`final=error`)。codex は利用上限に達していない(同じ時刻に `codex login status` は通っている)。 codex は受け取ったプロンプトを err.log へ写す。プロンプトの「既存コメント」の節に、PR に付いた Amazon Q Developer のレビューコメントの本文があり、その中の平文 `BigQuery quota exceeded` が `plugins/ndf/scripts/lib/monitor_patterns.py` 28 行目の `\b(?:quota exceeded|rate limit exceeded)\b` に一致した。引用の判定(`_match_is_quoted`)はバッククォート・「」・引用符の内側しか除外しないため、平文のコメント本文は除外されない。 再現の形: 既存のレビューコメントに `quota exceeded` を平文で含む PR で cross-review を起動し、codex を担当にする。 ## どこで見つけたか - `plugins/ndf/scripts/lib/monitor_patterns.py:28`(利用上限の文言)と `_match_is_quoted`。走査は `plugins/ndf/scripts/lib/monitor_scan.py` の `_scan_patterns` - 監視の結末: `/tmp/ndf-worktrees/takemi-ohama--investment/pr99/.cross_review/codex-review-pr99-monitor.json`(`"reason": "usage_limit"`、`detail` が Amazon Q のコメントの行) - takemi-ohama/investment PR #99 の cross-review round 1 ## なぜこの変更の範囲外なのか PR #99 の受け入れ条件は `ops.source_registry`・`ops.calendar_day` を作り直す道具であり、NDF の監視の判定は含まない。直す場所は NDF プラグイン側にある。根拠: Value 5(確かめた事実で判断する)(MVV 版 1)。 ## 直さないと何が起きるか 既存コメントに `quota exceeded` / `rate limit exceeded` を平文で含む PR(クラウドの制限を扱う変更では自動レビューがよく書く)では、codex が毎ラウンド誤って usage_limit となり、cross-review が収束に届かず中断する。既存コメントのスナップショットは解決済みのスレッドも含むため、スレッドを閉じても解けない。回避は `--exclude codex` しかなく、レビューの独立性が下がる。 ## 由来 PR #99(takemi-ohama/investment) ## 修正レイヤー 既存コメントのスナップショットの行(`path:line [user] 本文` / `[PR-COMMENT] [user] 本文`)は、grep 形式の除外にも 25b94ff04(差分・コメント・Markdown の行を除く)の除外にも当たらず、`_scan_early_fatal` が致命を返す(ndf 10.17.68 で 3 形とも再現)。行の形で除外を足し続けると、次の引用の形で再発する。直す層は照合の範囲である。 1. codex が err.log へ写したプロンプトの範囲を照合から外す 2. 一般語の `quota exceeded` / `rate limit exceeded` を、CLI が自分で出す形(行頭の `ERROR:` など)に限る。codex の実際の上限の文言(`You've hit your … limit`・`exceeded retry limit, last status: 429`)は別の行で拾っている 回帰テストには、スナップショットの 2 つの形をそのまま入れる。回避は `--exclude codex` だけである。
Activity