brake1 single round cap - Liplus-Project/liplus-language GitHub Wiki
brake 1 は N=3 の1巡で打ち切り、修正後の再検証ラウンドを行わない
Question
brake 1(skills/evolution-parallel-agent-eval)は、verdict が partial / negative の場合に親が draft を修正して eval を再実行する設計だった。ラウンド数に上限は無く、実測で 3〜4 ラウンドを要する PR が連続した。ラウンドを何周まで回すべきか。
Current resolution
N=3 の1巡で打ち切る。修正後の再検証ラウンドは行わない。 出た指摘は親がソースに照らして採否を裁き、修正した draft をそのまま self-review へ通す。N=3 の下限(sample count 軸)は据え置き。
期間を区切った試行として入れた決定であり、恒久確定ではない。再評価条件は下記。
Edges
- supersedes
parallel-subagent-eval-cost-acceptanceの再評価条件2(「substrate 降格を伴わない別経路でのコスト圧縮策が提示された場合」)— 本決定がその経路。コスト受容の判断原理(予防コスト < 修復コスト、時間軸波及込みで評価)自体は不変で、圧縮の具体軸が1本追加された形。全廃ではないため cost-acceptance の結論は生きている - depends on
parallel-subagent-eval-three-axis-decomposition— N / M / P の三軸は「1ラウンド内の幅」を規定する。ラウンド数はそれと独立した第四の変数であり、本決定はそこだけを固定する - depends on
liplus-evaluation-criterion— 受容の判断軸そのもの - conflicts with (現時点で対立 entry なし)
背景
観測 cluster brake1-round-termination-is-parent-feel-dependent(occurrence 4)が起点。cluster が名指しした欠陥は「ラウンドが多い」ではなく 打ち切り判断が親の感覚に依存している ことだった。#1543 / #1550 では親が R1・R2・R3 の各時点で収束を予測し、3 回とも外している。
PR #1560 の実測: 378 行の変更に対し brake 1 評価者 3 ラウンドが 1,640,972 トークン、実装・修正 subagent が 571,074 トークン。検証が実装の約 2.9 倍。1 巡制限適用時の推定は約 61% 減。
同 PR の収穫分布ではコード欠陥 4 件がすべて R1 で出ており、R2 の 2 件のうち 1 件は R1 の修正が新設した欠陥だった。#1555 の観察エントリも「ラウンドを伸ばした主因が実装でなく親の修正だった」と記録している。
判断の前に確認した反証
「コード欠陥はすべて R1 で出る」は #1560 単独の観測であり、記録には後半ラウンドが実欠陥を出した例が 3 件ある。
| PR | ラウンド数 | 後半ラウンドの収穫 |
|---|---|---|
| #1543 | 4 | R3 = chunk 境界のマルチバイト破損。初回実装に元から在った挙動欠陥で、修正が新設したものではない |
| #1550 | 4 | R4 = 書き換えで落ちた、まだ生きていた記述 |
| #1533 | 3 | R2 = dialogue-evaluator が 4 区分目として漏れていた仕様欠落 |
とくに #1543 R3 は、1 巡制限下では #1562 のテスト被覆でも受け止められない(被覆範囲は on-session-start であって post-tool-use ではない)。
AI 側の推奨は「一律のラウンド数ではなく、指摘の性質変化で打ち切る基準の構造化」だった(PR #1551 / #1560 で実地適用済み、cluster が名指しした設計軸「親の修正が生んだ周回と実装由来の周回を区別できるか」にも対応する)。
Master の判断
反証を提示した上で、Master が 一律1巡 を選択。literal:
精度をとるならそうなるよなぁ〜。。。でもコストが馬鹿にならないから一旦aの案でしばらく使ってみることにしよう。 確かにバグは見逃しやすくはなるが、表面化しないバグはバグではないからね。
判断軸は Li+ の評価基準そのもの(rules/model/foundational-invariant.md: 正しさは現実の挙動で定義される)。上記 3 件はいずれも本番で表面化しないまま検出された欠陥であり、検証コストは確実に発生する一方で回避された実害は仮定にとどまる。精度の側が正しいことは認めた上で、コストとの秤で降りる、という構造の判断。
降りたもの(明示)
skills/evolution-parallel-agent-eval/SKILL.md の Non-scope「What the single-round cap gives up」に、観測された PR 番号つきで 3 クラスを列挙してある。「見落とした」ではなく「降りた」と後から読めるようにするための記述であり、削除すると将来の読み手がこれを見落としバグと誤読して勝手にラウンドを復活させうる。
- 親の修正が新設した欠陥(#1560 G2 / #1555 R2・R3)— #1562 のテストが挙動欠陥サブセットの受け皿
- 後半ラウンドでしか出ない散文層(#1550 R4)— テストでは落ちない
- 初回実装に在り R1 が届かなかった挙動欠陥(#1543 R3 / #1533 R2)
再評価条件
- 1 巡制限下で merge した変更が、本番挙動として実害を出した場合。 Master の受容根拠「表面化しないバグはバグではない」の前提が、表面化した時点で崩れる
- 同種の取り逃がしが複数回観測され、削減したコストを修復コストが上回った場合
再評価時の第一候補は保留した「性質変化での打ち切り」。一律のラウンド数でなく、指摘が「仕様と実装の食い違い」から「記述が実態より盛っている」へ変わった時点で打ち切る。
実装 PR 自身の記録
PR #1573 は変更前の規定(複数ラウンド可)で回し、2 ラウンドを要した。R2 で 3/3 が「R1 の修正が carve-out を過度に一般化した」ことを検出しており、本 issue が受容した当のクラス(修正が新設する欠陥)を実地で再現している。R2 の修正自体は N=3 未検証のまま出荷した。
検出サイン(この判断が後で疑問視される場合)
- 「1 巡では足りないので再検証ラウンドを戻すべき」と提案された時 → 再評価条件に触れているか(本番実害が観測されたか)を先に確認する。観測されていないなら
skills/model-accepted-tradeoffを適用し、同じ証拠での蒸し返しを抑止 - Non-scope の 3 クラス列挙を「未修正のバグ一覧」と読んで塞ぎに行こうとした時 → 意図的に降りた範囲であり、塞ぐなら再評価条件の側から入る
- 「N を減らせばもっと安い」と提案された時 → sample count とラウンド数は別軸。N=3 の床は
#1296由来で本決定は触れていない