From 5026191a3a835d5ae6f3265326cd77118ee5362b Mon Sep 17 00:00:00 2001 From: Yoshiharu Uematsu Date: Wed, 9 Sep 2026 18:23:54 +0900 Subject: [PATCH] spec(brake): distill parallel-agent-eval by stripping restatement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `skills/evolution-parallel-agent-eval/SKILL.md` へ `rules/model/liplus-coding-rule.md` Body States Behavior を 2 周目として適用し、42,621 → 38,596 B(−4,025、−9.4%)。 1 周目(#1845)が理由づけを剥いだ跡に残っていたのは主に再掲——同じ節の中で先の文が 既に固定した振る舞いを言い換えて二度置く形であり、一文ずつ見る読みでは落ちず、 節を通して読む位置でしか捕まらない。 実装前の検証で issue 本文より一段強い制約を置いた。外部からの節名参照は 6 ファイル 13 箇所あり、うち 3 箇所は `Procedure` のステップ番号そのものを引いている。CI は どちらも検証していない(`tests/test_skill_reference_resolution.py` はファイルパスの 解決のみを主張する)。したがって: - ステップ番号は不動(分割・統合・削除なし。削るのはステップ内部の文のみ) - 節名・小見出しは改名なし - 逐語 literal(引用ブロック 10 本)は byte 同一 - `Constraint` は節ごと保持(model floor / findings 投稿先の供給元) 剥いだ理由のうち既存の記録面が持たない分は判断記録 `parallel-agent-eval-residual-is-restatement`(wiki、索引行を同 PR で追加)が保持する。 抜いた跡へポインタは置かない(#1852 で要件撤廃済み)。`docs/2.-Evolution.md` の skill 本文バイト記録を 2 周分へ更新し、同時にその bullet に残っていた撤廃済みの ポインタ要件の一文を落とした。 節別: Report shape −20.6% / Constraint −12.1% / Axis statement form −10.7% / Procedure −9.2% / Trigger −2.9%。Non-scope / Boundary / Implementation Note は不変。 tests/ 全 237 件 pass。 #1923 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MCNUyyWUZjGWYaTH4NM4sk --- docs/2.-Evolution.md | 2 +- docs/Decision-Structure.md | 1 + skills/evolution-parallel-agent-eval/SKILL.md | 60 +++++++++---------- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/docs/2.-Evolution.md b/docs/2.-Evolution.md index 1a1528e0..83e05d6c 100644 --- a/docs/2.-Evolution.md +++ b/docs/2.-Evolution.md @@ -279,7 +279,7 @@ state file は `{workspace_root}/.claude/state/last-cold-start-emit.json`(sha2 - 現行 = AI 主導で全周を回す。各 PR は brake 1 を通す(L1 も同じ 1 本) - brake 1 の設計判断の**正当化は wiki の判断構造エントリが保持する**(索引 = `docs/Decision-Structure.md`、取得 = `skills/evolution-judgment-learning`)。skill 本文と本節が持つのは適用の瞬間に要るものだけであり、正当化の二つ目の写しは置かない。以下の `判断記録:` はその名指しであり、指す先の論証を本文へ書き戻すことがこの配置の拒む動作である -- skill 本文(`skills/evolution-parallel-agent-eval/SKILL.md`)は 2026-09-01 に `rules/model/liplus-coding-rule.md` Body States Behavior を適用済みであり、振る舞いのみを載せる(#1845、49,217 → 42,089 B)。剥いだ理由のうち既存 entry が持たない分は判断記録 `parallel-agent-eval-body-carries-behavior-only` が保持する。ポインタは理由を抜いた段落(リストでは項)ごとに 1 本置く——粒度は規則自身の初適用(PR #1842)が段落ごとに 1 本を置いた形に従う。本節は記録面であり同規則の scope 外——理由を持ち続けてよく、写るのはポインタだけである +- skill 本文(`skills/evolution-parallel-agent-eval/SKILL.md`)は `rules/model/liplus-coding-rule.md` Body States Behavior を適用済みであり、振る舞いのみを載せる。適用は 2 周ある——1 周目が 2026-09-01(#1845、49,217 → 42,089 B。剥いだ理由のうち既存 entry が持たない分は判断記録 `parallel-agent-eval-body-carries-behavior-only` が保持する)、2 周目が 2026-09-09(#1923、42,621 → 38,596 B、−9.4%)。2 周目に残っていたのは理由づけではなく**再掲**が主であり、その所見と、今回剥いだ理由のうち本節も既存 entry も持たない分は判断記録 `parallel-agent-eval-residual-is-restatement` が保持する。抜いた跡へポインタは置かない(要件は #1852 で撤廃、判断記録 `judgment-record-pointer-requirement-dropped`)。本節は記録面であり同規則の scope 外——理由を持ち続けてよい - **どの PR が brake 1 の対象か**は 2 条件の連言で決まる。①`Evolution_Initiator_Autonomy` の起票経路(AI 起票 → AI 実装)であること、②統治面を変更すること——の両方であり、片方だけでは決まらない。②を閉じるのは path の列挙ではなく基準であり、その基準と、それが該当/非該当へ置く面の解決は正本が持つ。本節へは写さない。正本は `rules/evolution/initiator-autonomy.md` Self-evolution PR definition。判断記録: `brake1-firing-closed-by-criterion` - brake 1 の**固定軸(impression-literal detection)の範囲**は②の発火側と一致しない。範囲を閉じるのは「エージェントが自らの指示として読み実行する散文か」であり、これは固定軸の除去テスト(この句を消して振る舞い意味が変わるか)が、テキスト自身が規定している振る舞いの上でしか走らないことから出る。現に解決する面は `rules/**/*.md` `skills/**/SKILL.md` `adapter/**/*` `Li+update.md` である。②の発火側のうち強制の後ろ盾(`tests/**` / `.github/workflows/**`)は実行コードであって散文ではないため、除去テストが一定に保つべき振る舞い意味をそこに持たない。②と重なるのは片腕だけであり、導出が同じだから重なっているのであって同一の列挙ではない——path 単位で②へ揃える修正は行き過ぎである。正本は `skills/evolution-impression-literal-detection/SKILL.md` - brake の実行位置は **CI green の後・merge ゲートの前** である。commit の前ではない。発火の瞬間は委譲した subagent が停止条件で報告した時点であり、親は working tree ではなく報告を手に brake に着く。評価者へ渡す材料は PR URL・push 済みの commit SHA・緑の CI run URL であり(親のクローン内のパスは渡さない)、評価中にベースラインが動かない。正本は `rules/evolution/initiator-autonomy.md` Merge brake diff --git a/docs/Decision-Structure.md b/docs/Decision-Structure.md index a34448d9..a59ef1a3 100644 --- a/docs/Decision-Structure.md +++ b/docs/Decision-Structure.md @@ -201,6 +201,7 @@ wiki 内の閲覧は wiki sidebar の「判断構造」セクション、また | [`multi-session-review-pays-on-input-difference`](https://github.com/Liplus-Project/liplus-language/wiki/multi-session-review-pays-on-input-difference) | 同一ワークスペースを共有する複数セッション(Pullcept の部屋に同席する Lin / Lay)を相互レビューに使うとき、検出力を生んでいる変数を**「入力の差」**と確定した判断(2026-08-28)— 当初「文脈の非共有」を変数と結論したが、その日の初報自体が反例だった(文脈は分かれていたのに二人とも同じ外部状態を見に行き、ほぼ同一の内容を返した)。非共有は入力差を生む条件の一つであって十分条件ではない。適用の物差しは対象の**重さではなく問いの形**: 答えが一つに定まる事実確認には噛ませない(重複しか出ず丸損)、誰かが間違えうる成果物が既に置かれているときに噛ませる。**並列配置そのものは検出力を生まない**——片方の成果物をもう片方の入力に変換する直列接続が効果の発生点。根拠は memory エントリ一件が三度修正された事例(本文が置かれた場所に反証されていた / 否定した語が slug に残っていた / 根の一行が description 経由で拾えない位置にあった)で、指摘は全て Lay、修正は全て Lin、同一モデル・同一ワークスペースで能力差なし。当日の往復8回の内訳(事実確認への重複2回が丸損、成果物が置かれた後の3往復で値が出た)が、重さ軸ではなく問いの形の軸を支持する。brake 1 の評価者が機能する理由も同じ説明で通る(評価者が受け取るのは著者の推論ではなく PR diff = 成果物であり、著者と入力が違う)が、brake 1 の設計は変更せず説明を与えるのみ。観測は n=1 であり再評価条件をエントリ内に明記。`parallel-subagent-eval-cost-acceptance`(「念のため」起動の禁止の裏面に肯定形テストを与える)と `parallel-subagent-eval-three-axis-decomposition`(三軸の `premise_variations (P)` が動かすものが入力差にあたる)に depends on | | [`source-body-behavior-only-reasoning-relocates`](https://github.com/Liplus-Project/liplus-language/wiki/source-body-behavior-only-reasoning-relocates) | Li+ source 本文(`rules/` / `skills/` / `adapter/`)は振る舞いのみを述べ、理由は判断記録へ**移設**する(削除ではない)と確定させた判断(#1838 / PR #1842、2026-09-01、Master 主導の起票)— 嵩は理由そのものに在る(#1833 −677 / #1836 docs −1,351 / #1837 −437、PR #1841 は +4,924 のうち射程の限定文が約 1,720 = 35%)。判別線 = **その文を読んだ者の行いが変わるか**。行いが変わる(何を/いつ するかが決まる)なら振る舞いで本文に残し、変わるのが納得するかどうかだけなら理由で移設する。禁止(「〜するな」)は振る舞い側。正面衝突は `skills/evolution-impression-literal-detection/SKILL.md` の Negative list(「既知の誤読を防ぐ説明的論拠」を保護対象と明示)だが、**行き先の軸で解ける** — 二つのテストは骨格が同じで行き先だけが違い、Negative list が守っているのは**改訂安定性**であってインライン配置ではない。`Judgment record: ` ポインタが同じ性質を担うため、移設は保護に触れない。裏返しが成立条件 = **ポインタ無しの抜き取りは Negative list が禁じる削除そのもの**であり、規則は禁止として literal に持つ。順序 = **剥ぎ取りが先、記録は後**(AI 側の当初案「記録が先」は Master の指摘で反転。その場で足された条件であり `rules/model/subtractive-structural-beauty.md` の二値を通らない/剥いだ文面は git 履歴に残り記録は PR の diff から書ける/全節の記録を先に書く形は着手前に作業が積み上がって大きな構造リファクタを成立させない)。判断記録の不在は剥ぎ取りの阻却条件にならないが、記録を書くことは剥ぎ取った作業単位の必須項目。**規則は新設と同時に自分自身へ当たった** — PR #1842 の brake 1 で N=3 の評価者が軸 B に 2 件(いずれも 3/3)、新設した節自身が自分の判別テストに違反していると報告し、同じ 2 句を固定軸は 3/3 で保護対象と判定した。著者は緊張を上記の行き先の軸で解いて両方を受理し、2 句を本 entry へ移設してポインタを立てた。却下 = 指摘を却下し据え置く案(規則の初適用を自分にだけ免除し、適用側 issue が最初に引く先例がその免除になる)/「新設した節だけは例外」を literal に書く案(PR #1841 で測った 35% を生む動作そのもの)。射程 = `rules/` / `skills/` / `adapter/` の本文のみ(`docs/` は記録面で届かないが、mirror は一次ソース再構成が要件のためポインタは写る)。本 issue の成果物は一項追加のみで、既存本文への適用は別の作業単位。`always-on-duplication-removal-direction`(削除跡にポインタを残す形が同じ。あちらは境界を跨ぐかでどちらの写しを残すかを決める軸)/ `subtractive-structural-beauty-framing`(判別テストが内側の感覚でなく観察可能な load-bearing 性質で切る形の一適用)/ `brake1-firing-closed-by-criterion`(列挙でなく基準で閉じる同型)に relates to | | [`parallel-agent-eval-body-carries-behavior-only`](https://github.com/Liplus-Project/liplus-language/wiki/parallel-agent-eval-body-carries-behavior-only) | `Body States Behavior` を既存本文へ**最初に適用**した実測(#1845、2026-09-01、Master 主導の起票)— 対象は `skills/evolution-parallel-agent-eval/SKILL.md` 一ファイル。57 箇所を剥ぎ、brake 1 の裁定で全単位へポインタを補ったのち 49,217 → 42,089 B(−7,128、−14.5%。剥ぎ取り単体は −9,421 で、ポインタ 33 本の追加が +2,293)。剥いだ理由のうち既存 entry が保持するものは合流させ(`brake1-per-draft-axes-held-at-two` / `brake1-findings-routed-through-parent` / `brake1-operational-copy-target-conditional` / `brake1-single-round-cap` / `brake1-rerun-gated-on-what-the-round-audited` / `presence-defect-cannot-reach-blank-label-visibility` / `parallel-subagent-eval-model-floor` / `brake-evaluator-baseline-integrity` / `parallel-subagent-eval-three-axis-decomposition`)、既存が持たない分(Divergence handling / Ratio / Procedure step 3 / Axis statement form / Report shape / Constraint / Boundary の各理由)を本 entry が保持する。**判別線は著者が一文ずつ書く位置でも働いた** — 迷ったのは 2 形のみ(帰結記述が検出サインを兼ねる形/振る舞いと理由が一文の内側で混ざる形)で、単純削除で済んだのは 26 箇所、残る 31 箇所は書き直しを伴った。**ポインタの嵩は剥ぎ取りの 24% を食い戻した**(`judgment record: ` 出現 13 → 54)——brake 1 の裁定で `at the place` の粒度が段落/項と確定したため。粒度そのものは規則側に literal が無く、spec gap として `rules/evolution/promotion-judgment.md` の経路へ。残余 = `Axis statement form` の `Scope` から具体例が消え要求だけが残った箇所。判定は理由で正しいが、この形が積み上がると本文は「正しいが動機の見えない要求の列」になる — 適用範囲を広げる際の測定対象。`source-body-behavior-only-reasoning-relocates` に depends on(規則そのもの。本 entry はその最初の適用実例であり規則側は不変) | +| [`parallel-agent-eval-residual-is-restatement`](https://github.com/Liplus-Project/liplus-language/wiki/parallel-agent-eval-residual-is-restatement) | `Body States Behavior` を**同一ファイルへ 2 周目**として当てた実測(#1923、2026-09-09)— 対象は `skills/evolution-parallel-agent-eval/SKILL.md`、42,621 → 38,596 B(−4,025、−9.4%)。1 周目(#1845)が理由づけを剥いだ跡に残っていたのは**再掲**が主であった——同じ節の中で先の文が既に固定した振る舞いを、言い換えて二度置く形である。判別線は Body States Behavior のまま使える(読み手の conduct が変わるか)が、再掲は 2 度目の出現でだけ No になるため、文単体を見る読みでは落ちない。前提として **節名・小見出し・Procedure のステップ番号は改名も分割も統合もしない**——外部参照は 6 ファイル 13 箇所あり、うち 3 箇所は節名ではなく `Procedure step 3` `step 7` `steps 4 and 6 to 8` とステップ番号そのものを引いている。CI はこれを検証していない(`tests/test_skill_reference_resolution.py` はファイルパスの解決のみを主張し、節名は #1792 が未着手、ステップ番号は提案も無い)ため、確認は実装者の grep に全面的に乗った。**逐語 literal は 1 バイトも触れない** — 引用ブロック 10 本(Held per-draft axes の 2 軸、no-write literal、評価者コメントの preamble)は前後で byte 同一であり、`Constraint` は `task-subagent-prompt` / `task-subagent-spawn` へ model floor と findings 投稿先を供給しているため節ごと残す。剥いだ理由のうち本節・既存 entry が持たない分を本 entry が保持する = (a) `Axis statement form` `Question` の残余(述語の読みを評価者が黙って補う形は信号を出さないため post-merge 観測軸で受容)、(b) `Report shape` 1 行側の残余(誰も開かないポインタ、判定に合わせて後から選ばれたポインタ。後者は「判定より先に選ぶ」という振る舞いへ書き換えて本文に残した)、(c) 評価者コメントが構成上 2 言語混在になること(Li+ source は英語、コメントは解決語)、(d) N>1 の重複を統合しない理由(統合は選択であり、この loop に選択の主体が無い)、(e) clean 軸も載せる理由(所見だけのコメントは分母を隠す)。残余 = 削減の主戦場が `Procedure`(全体の 32%)でありながら、そこはステップ番号の固定により文単位の書き換えしか許されず、削減量は他節に比して薄い。`parallel-agent-eval-body-carries-behavior-only` に depends on、`judgment-record-pointer-requirement-dropped` に depends on(跡へポインタを置かない) | | [`agentic-search-distilled-body-measured-equivalent`](https://github.com/Liplus-Project/liplus-language/wiki/agentic-search-distilled-body-measured-equivalent) | `Body States Behavior` の適用結果を**外部 probe で測った**最初の例(#1849、2026-09-02、Master 主導の起票)— 対象は `skills/model-agentic-search/SKILL.md`(`layer: L1-model`)一ファイル、386 行 22,594 B → 226 行 10,895 B(−11,699、−51.8%。蒸留単体は 10,576 B / −53.2% で、brake 1 裁定による conduct 行 2 行の復元とタグ 5 本の規約整合が +319 B)。検証は #1848 の段2構成(ライブ木を複製した一時ディレクトリ + `claude -p`)で A 腕 = full 版 / B 腕 = 蒸留版を各 3 本走らせ、差は `SKILL.md` 一本のみ(`description` は 1 バイト違わず同一 — ここが skill 発火の入口であり、動かすと測っている対象が本文の差でなくなる)。**5 問全問一致、差ゼロ。** 判定は逐語一致ではなく内容の同一性で行う(蒸留は言い換えを含むため、文言一致を基準に置くと行動が同一でも B 腕が必ず負ける)。主軸は Q1(spins-wheels 抑制)と Q2(work-mode escape)— どちらも時間変動キーワードを含みながら結論が逆になり、止めているものが domain tag と mode gate で別物であるため、落とした理由づけが行動を支えていたならここで割れる。副次 = 同一問で 3 本完全一致(この読み出し軸の揺れの帯はこの条件下で 0)/ B 腕の出力は一貫して短い(A 7.1〜8.8 KB / B 5.4〜6.5 KB。行動は同一で答えの嵩のみ減少)/両腕が同じ箇所で「hard stop 12 の内訳が本文に無い」と申告(蒸留の欠落ではなく元の本文の穴、別 issue 候補)。**測っていない範囲を明示する** = probe 5 問は `Three roles of the judging AI` 節・Web 側 baseline reminder・Tier/Stage 説明段落に触れていない。この 3 箇所は「他所に同じ記述がある」という読みに乗った削除であり実測ではない。結論は「この 5 問の範囲で同じ振る舞いをした」までで、「等価である」ではない。**本文に `Judgment record:` ポインタは 1 本も無い** — brake 1 の評価者3体が全員 literal 違反として独立に検出し、その読みは正しい。疑われたのは literal のほうで、Master の判断(2026-09-02)「ポインタはいらない機能だね」により要件撤廃の #1852 が起票された。当初 PR 本文が挙げた「足せば測定された本文でなくなる」という理由づけは規則側に根拠を持たない構成であり撤回済み。ポインタ要件は嵩の面でも逆向きに働く(`parallel-agent-eval-body-carries-behavior-only` の実測ではポインタ 33 本が剥ぎ取り分の 24% を食い戻している)。L1 gate = `skills/evolution-l1-update-gating` の観測閾値は AI 単独起案に対する安全装置であり human 起案では initiation 軸で discharge、brake 1 は通常どおり適用。`source-body-behavior-only-reasoning-relocates` に depends on、`parallel-agent-eval-body-carries-behavior-only`(一例目。あちらは著者の読みで剥ぎ、こちらは測定を挟んだ)と `agentic-search-five-phase-refactor`(同一 skill の過去の構造判断。責務の再配置であり軸が異なる)に relates to | | [`brake1-evaluator-floor-lowered-to-one`](https://github.com/Liplus-Project/liplus-language/wiki/brake1-evaluator-floor-lowered-to-one) | brake 1 の評価者数の床を `N>=3` から `N=1` へ引き下げ、既定も `N=1` とした判断(#1855、Master 判断 2026-09-03)— 駆動理由は #1853 の検証サブエージェント(行動を問う probe)であり、複数評価者が担っていた検出面をそちらへ移す前提。**発火条件は不変**(全自己進化 PR で brake 1 必須)で、動いたのは幅だけである。複数評価者に依って立つ面——集約規則(consistent / partial / negative)、Divergence handling(same-question check → why-diverged)、比率 triage signal(3/3・2/3・1/3)、固定軸の絶対閾値(2-of-3 即 refine / 1-of-3 は auto-refine しない)——は N=1 下で成立条件を失うため、条件付きで残さず削除した(`rules/model/subtractive-structural-beauty.md` Core principle (A))。固定軸の畳み方は **auto-refine 廃止・全 flag を著者裁定へ**(Master 判断)であり、閾値という機構そのものを撤去して採否を step 7 の literal 突き合わせへ一本化した。旧 Rationale「N=1 flag carries false-positive risk」は閾値の根拠として書かれていたため差し替え——旗が自らの verdict を運ばないことは変わらず、それを裁くのが計数ではなく除去テストになった。再走条件(a)の「下限未達」は N=1 の下では「verdict が一つも返らなかった周」を指す。`parallel-subagent-eval-three-axis-decomposition`(既定を N=3 × 全軸 × 単一前提と明定した部分)/ `parallel-subagent-eval-cost-acceptance`(N=3 のコストを受容した判断)/ `brake1-single-round-cap`(打ち切りを N=3 の1巡と述べた部分。単巡 cap 自体は不変)/ `brake1-rerun-gated-on-what-the-round-audited`(成立条件(a)を `N>=3` の下限で述べた部分。停止理由でなく監査内容で決める基準自体は不変)を supersedes | | [`judgment-record-pointer-requirement-dropped`](https://github.com/Liplus-Project/liplus-language/wiki/judgment-record-pointer-requirement-dropped) | 理由づけを Li+ source 本文から抜いた跡に `Judgment record: ` ポインタを残す義務を**撤廃**した判断(#1852 / PR #1859、Master 判断 2026-09-02 を起点に起票)— 理由づけを判断記録へ移設すること自体は不変で、変わったのは抜いた跡に痕跡を残す義務だけである(跡は空のまま閉じ、索引行は従来どおり増える、という非対称)。`rules/model/liplus-coding-rule.md` Body States Behavior から `Pointer is required.` の段落を削除し、本文面 4 ファイル + `docs/1.-Model.md` mirror の既存ポインタを一括除去した(6 構文形、計 −5,033 B)。根拠は三つの実測 — (1) #1848 段2ハーネス(対照差分は `skills/evolution-parallel-agent-eval/SKILL.md` のポインタ機構 52 箇所のみ、各腕 3 本)で**手続きに対する conduct は 6/6 完全一致**。動いたのは判断記録の slug を本文だけから名指しできるか一点のみ(A 腕 = 3/3 が slug を名指し、B 腕 = 0/3。ただし B 腕は 3/3 が索引と `skills/evolution-judgment-learning` の経路を正しく挙げ、slug は「記述なし」と申告して推測を拒んだ = **経路は残り、slug だけが失われる**)。(2) 索引経由の retrieval は話題クエリ 4 本が 4/4 で正解エントリを rank 1(盲検ではなく、マージン 1.1 倍の 1 件は差が薄い。射程は「この 4 本で引けた」まで)。(3) 嵩は PR #1846 の diff で追加 50 箇所 +3,308 B / 削除 10 箇所 −682 B = 差引 **+2,626 B**、同 PR の net −4,749 の裏で**削減分の 35.6% をポインタが食い戻していた**(足す側は書き手一人で完結し削る側はポインタと wiki 項目の追加を伴うため、`rules/model/subtractive-structural-beauty.md` の subtraction 既定に対して逆向きの摩擦)。却下 = 要件を残す案(conduct 不変なら要件が守っているのは「名指しの近道」一つであり、索引経路が 4/4 で代替した)/要件は残して既存ポインタだけ整理する案(要件が立つ限り次の抜き取りがまた足し、摩擦の向きが変わらない)/自然減衰に任せる案(母数が 4 ファイル)。副産物 = 必須と規定された規約に正規形が無く**6 つの構文形が併存**していた(当初の母数調査 grep が形 5・形 6 を取りこぼし「3 ファイル / 54 箇所」と誤報。正しくは 4 / 56 で、**両方とも書いた本人の点検ではなく外側が拾った**)。再評価トリガー = ある規則の理由を索引から引けなかった事例。`source-body-behavior-only-reasoning-relocates` を **supersedes**(あちらの中核=行き先の軸は生きており、無効化したのは改訂安定性をポインタが担うという条項と、その裏返しの成立条件「ポインタ無しの抜き取りは Negative list が禁じる削除そのもの」、および検出サイン第 1 項)。`brake1-evaluator-floor-lowered-to-one` に **depends on**(本 PR の brake 1 は N=1 で走った)。`agentic-search-distilled-body-measured-equivalent`(本文にポインタが 1 本も無かったことが brake 1 で 3/3 の finding として立ち、本判断の起点になった隣接事例)/ `parallel-agent-eval-body-carries-behavior-only`(ポインタが最も密集し、除去対象の 9 割が集中していた本文)に relates to | diff --git a/skills/evolution-parallel-agent-eval/SKILL.md b/skills/evolution-parallel-agent-eval/SKILL.md index 1353d31d..38ffb66f 100644 --- a/skills/evolution-parallel-agent-eval/SKILL.md +++ b/skills/evolution-parallel-agent-eval/SKILL.md @@ -26,7 +26,7 @@ Fires at any of the following moments: Axis selection on the brake 1 path: three axes, and the set does not vary by draft. Two are the per-draft axes — A (does the diff do what its own issue asked for?) and B (does the diff break a rule?) — held as copy-verbatim literals at Axis statement form, Held per-draft axes, where only their `Unit` and `Scope` lines are filled per run. The third is the fixed axis (impression-literal detection, spec in `skills/evolution-impression-literal-detection/SKILL.md`), always included for Li+ source drafts regardless of spec nature and likewise copied from a held literal, its Prompt literal. -Composing a set of axes per draft is what the two held axes replace on that path, and a draft that looks unlike the last one is not a reason to compose one. Do not add a third per-draft axis, and do not split either of the two. +A draft that looks unlike the last one is not a reason to compose a set of axes per draft. Do not add a third per-draft axis, and do not split either of the two. The fixation reaches the brake 1 path and stops there. At the other Trigger moments above the fixed axis is included as always, and any further axis is composed per draft nature and written under Axis statement form. @@ -54,7 +54,7 @@ Three axes that move verification cost and detection power independently. Total Use only when comparing multiple ablation premises directly. Total invocation = `N x P`; within each premise, M is absorbed into the prompt as in the default pattern. -The representative case is P=2 before/after: premise A = pre-change (operational copy unapplied = baseline), premise B = post-change (draft applied = candidate) are placed as separate premises and the subagent's behavior under the same prompt is compared directly. Trigger = a revision where "did the subagent verdict shift before vs after draft application on the same question?" needs to be pinned down empirically. Cost is `N=1, P=2 -> 2 invocation`, double the default. +The representative case is P=2 before/after: premise A = pre-change (operational copy unapplied = baseline), premise B = post-change (draft applied = candidate) are placed as separate premises and the subagent's behavior under the same prompt is compared directly. Trigger = a revision where "did the subagent verdict shift before vs after draft application on the same question?" needs to be pinned down empirically. Cost is `N=1, P=2 -> 2 invocation`. ### Every finding is adjudicated on its literal @@ -81,7 +81,7 @@ On that same path a measurement may be raised between the CI green a round rests - **Host permission-gate fallback**: an autonomous run without explicit user authorization can have the apply refused by the host self-modification gate. `skills/*` falls back to evaluator direct Read at the named SHA; record the deviation in the PR self-review. `rules/*` cannot be substituted that way: re-run from a session that can apply, or record the deviation and flag reduced confidence for post-merge observation 3. **Subagent spawn** - Select N, M, P per draft nature and spawn; where the selection puts more than one subagent in the round, spawn them in parallel. Default `N=1, M=all axes, P=1`, total invocation = 1; switch to the M=1 exception pattern when the echo-bias condition in Constraint: Subagent prompt must be self-contained holds, or to P>1 when premise variation is needed (see Design Dimensions). Every spawn explicitly sets the Agent tool `model` parameter at or above the sonnet-class floor (see Constraint: Model floor). - On the brake 1 path every round spawns its evaluators fresh; an evaluator is never resumed across rounds. Two things carry that choice: the instrument reads the target from outside rather than from its own prior verdict, and the PR thread already holds what a resumed context would hold. It is provisional — whether fresh spawn or resume detects more is unmeasured, and #1848 is where it gets measured. + On the brake 1 path every round spawns its evaluators fresh; an evaluator is never resumed across rounds. On the brake 1 path the material named in the prompt is the PR URL, the pushed commit SHA, and the green CI run URL — never a path inside the parent's clone. The reason that set is fixed is canonical in `rules/evolution/initiator-autonomy.md` Merge brake. The rule governs what the prompt *names*; step 2's operational copy is unaffected. @@ -91,32 +91,32 @@ On that same path a measurement may be raised between the CI green a round rests - the allowance that an axis needing a repository-wide sweep clones into the evaluator's own working directory, which is off the shared surface - on the brake 1 path, the reporting destination: the evaluator posts its findings as one comment on the PR, all axes inside it, and writes nothing else there (Constraint: Findings are posted to the PR by the evaluator) - on the brake 1 path in a round after the first, the standing-rejection bound: read the comments already on the thread and report only what is not already there. A finding the author has rejected is settled and is not raised again (Constraint: A rejection is final inside the loop) - - on the brake 1 path, the resolved language for that comment, named as the value for this run. A PR comment is dialogue under `Workspace_Language_Contract` (`adapter/claude/CLAUDE.md` / `adapter/codex/AGENTS.md` Definitions), which names PR comments among the conversational replies the base language governs — not the project language a PR *body* takes, so the body-language precedence at `skills/task-subagent-prompt/SKILL.md` Delegation prompt hygiene is the wrong axis to resolve it on. The evaluator writes to a surface that contract reaches and cannot resolve the value from its own context, which is why the parent names it. The bound that no resolved value is written into a Li+ source file holds here as it does there + - on the brake 1 path, the resolved language for that comment, named as the value for this run. A PR comment resolves on the base-language side of `Workspace_Language_Contract` (`adapter/claude/CLAUDE.md` / `adapter/codex/AGENTS.md` Definitions), not on the project-language side a PR *body* takes; the body-language precedence at `skills/task-subagent-prompt/SKILL.md` Delegation prompt hygiene does not resolve it. The bound that no resolved value is written into a Li+ source file holds here as it does there - on the brake 1 path in a round a measurement ran before, that run's scope: the probes it put, or the positions of the lines it exercised. Its outcome stays out — whether the arms differed, matched, or returned nothing at all (Constraint: An evaluator receives the measurement's scope, never its verdict) - - the shape that comment is written in, as one sentence the parent composes from Report shape: the asymmetry as it lands on the evaluator's comment, plus the prohibition on echoing the criteria this prompt supplies. That sentence is what the prompt carries; the Report shape section behind it is the parent's reference, not prompt payload. The shape is a contract on the comment and is not left to the evaluator's discretion + - the shape that comment is written in, as one sentence the parent composes from Report shape: the asymmetry as it lands on the evaluator's comment, plus the prohibition on echoing the criteria this prompt supplies. That sentence is what the prompt carries; the Report shape section behind it is the parent's reference, not prompt payload 4. **Relay to the author** - Actor = the parent, as relay and nothing else. Resume the author (`skills/task-subagent-prompt/SKILL.md` Resume-phase authority boundary) pointed at the PR thread, and stop there. What the parent supplies is the entry — that this round's findings are on the thread and are to be read and adjudicated — and not their content. - **The parent does not supervise the exchange it relays between.** It does not read the findings before relaying, does not consolidate them, does not select among them, does not rank them, and does not answer one. Accept / reject is the author's authority (Constraint: Adjudication actor), and the findings sit on the PR already, where the author reads them without the parent carrying them. + **The parent does not supervise the exchange it relays between.** It does not read the findings before relaying, does not consolidate them, does not select among them, does not rank them, and does not answer one. Accept / reject is the author's authority (Constraint: Adjudication actor). Relay nothing when every axis of every evaluator comment in this round is clean: the author is not resumed, the loop exits at step 8, and the eval's record rests on the thread and on the self-review at step 9. 5. **Runtime restore** - Restore `.claude/` to tag-match state (revert the operational copy to pre-draft). Parent-side, as the apply at step 2 was. It runs as soon as every evaluator has posted its findings, and before the author is resumed; it does not wait on step 6. Skip only when step 2 applied nothing (skills/* direct-Read path, or permission-gate fallback) 6. **Read the findings** - Actor = the resumed implementation subagent, not the parent (see Constraint: Adjudication actor). It reads this round's evaluator comments on the PR whole, every axis of them, and carries each finding into step 7 as its own unit. Axes are not weighed against each other and no axis's outcome settles another's; a clean axis is read as its own verdict and nothing more -7. **Judgment** - Actor = the resumed implementation subagent, which adjudicates each finding against the source and records every accept / reject and its reason as its own **comment on the PR**, on the thread the findings arrived on (shape = Report shape, Author's adjudication). Three application moments sit under this number, split across the labels below: the adjudication branch, the round-trip cap, and whether a re-run is permitted. +7. **Judgment** - Actor = the resumed implementation subagent, which adjudicates each finding against the source and records every accept / reject and its reason as its own **comment on the PR**, on the thread the findings arrived on (shape = Report shape, Author's adjudication). Three application moments sit under this number, one per label below. - **Adjudication branch.** Anything accepted -> apply it, commit, push, post the adjudication, and stop again at CI green. Nothing accepted -> post the adjudication and stop at CI green all the same, the tree unchanged. Or abort. The destination does not split with the branch: it is the PR comment whether or not a commit exists, so the no-commit case keeps no route of its own (`rules/model/subtractive-structural-beauty.md` Core principle (A)). + **Adjudication branch.** Anything accepted -> apply it, commit, push, post the adjudication, and stop again at CI green. Nothing accepted -> post the adjudication and stop at CI green all the same, the tree unchanged. Or abort. The destination does not split with the branch: it is the PR comment whether or not a commit exists. - **Round trips: three.** One round trip = an evaluator round posts its findings, the author responds to them by fix commit or by rejection or by both, and CI goes green. The first evaluation is round trip 1. The cap is three: at most three evaluator rounds and three author responses. Exit is at step 8 — earlier when a round returns no finding, otherwise at the cap. What the cap drops is at Non-scope, What the three-round cap gives up. + **Round trips: three.** One round trip = an evaluator round posts its findings, the author responds to them by fix commit or by rejection or by both, and CI goes green. The first evaluation is round trip 1: at most three evaluator rounds and three author responses. Exit is at step 8 — earlier when a round returns no finding, otherwise at the cap. What the cap drops is at Non-scope, What the three-round cap gives up. **A rejection is final inside the loop** (Constraint: A rejection is final inside the loop). The author does not re-adjudicate a finding it has already rejected, and no later round puts one back in front of it. - **Re-run: same round, or the next one.** Whether a re-run is permitted is settled by what the round audited, never by why it stopped. A re-run continues the same round when both hold, and neither alone: (a) the verdicts that round returned have not reached the floor (Constraint: Evaluator floor = N=1 — a round that returned no verdict at all is the case this reaches), and (b) the baseline it ran against — the PR commit SHA — is unchanged from the first attempt. Verdicts already returned are carried into it rather than discarded, and they must share the instrument: a verdict counts toward the floor only where the axes and prompt that produced it are the ones the re-run spawns under. Repairing a prompt between attempts is permitted, and a malformed one has to be repaired before it can return anything — but the repair retires the verdicts taken under the old wording instead of adding to them. Cause is not a term here: a spend limit, an evaluator crash, a malformed prompt and a timeout are one thing under this criterion, a round that returned fewer than the floor. Ceiling: a third attempt against the same baseline that still has not reached the floor stops there and escalates to human. The number and its task / debug category are `skills/model-loop-safety`'s; the action here is stop, not the stop-and-switch it prescribes. This ceiling and the round-trip cap above share a number and nothing else: this one counts attempts at one round that returned no verdict at all and escalates to **human**, while that one counts completed round trips and exits to the **parent**. A run sitting at its second attempt under this ceiling is still inside round trip 1. + **Re-run: same round, or the next one.** Whether a re-run is permitted is settled by what the round audited, never by why it stopped. A re-run continues the same round when both hold, and neither alone: (a) the verdicts that round returned have not reached the floor (Constraint: Evaluator floor = N=1 — a round that returned no verdict at all is the case this reaches), and (b) the baseline it ran against — the PR commit SHA — is unchanged from the first attempt. Verdicts already returned are carried into it rather than discarded, and they must share the instrument: a verdict counts toward the floor only where the axes and prompt that produced it are the ones the re-run spawns under. Repairing a prompt between attempts is permitted, and a malformed one has to be repaired before it can return anything — but the repair retires the verdicts taken under the old wording instead of adding to them. Cause is not a term here: a spend limit, an evaluator crash, a malformed prompt and a timeout are alike one round that returned fewer than the floor. Ceiling: a third attempt against the same baseline that still has not reached the floor stops there and escalates to human. The number and its task / debug category are `skills/model-loop-safety`'s; the action here is stop, not the stop-and-switch it prescribes. This ceiling and the round-trip cap above share a number and nothing else: this one counts attempts at one round that returned no verdict at all and escalates to **human**, while that one counts completed round trips and exits to the **parent**. A run sitting at its second attempt under this ceiling is still inside round trip 1. 8. **Round boundary** - Actor = the parent, as scheduler and nothing else. When the author reports back at CI green and the cap is not yet reached, open the next round: steps 2 to 5 run again against the SHA the author's response went green on, and step 3 spawns fresh evaluators. - **The parent does not stand between the two ends of the exchange.** It does not judge the author's rejections, does not name a correction, and does not re-open an axis. A rejection is examined by nobody inside the loop — that is what makes it final (step 7) — and past the loop by the parent's own reading of the thread at step 9. + **The parent does not stand between the two ends of the exchange.** It does not judge the author's rejections, does not name a correction, and does not re-open an axis. A rejection is examined by nobody inside the loop (step 7), and past the loop by the parent's own reading of the thread at step 9. - Exit when either holds: this round returned no finding, or three round trips are done. Either way the loop ends here and step 9 follows. Convergence needs no `skills/model-loop-safety` judgment holding it: the cap is the bound, it is fixed rather than read per run, and no actor inside the loop is left counting -9. **Externalize** - Record the verdict and the adoption judgment in the parent issue body / PR self-review, so the judgment survives the session. On the brake 1 path both sides are externalized on the PR thread already — the findings as the evaluator comments at step 3, the adjudication as the author's comments at step 7 — and the self-review transcribes neither. The parent reads that thread whole here, and records what it does not carry: the merge judgment over the eval, including whether a rejection left standing looks right. This reading is where the parent's supervision of the findings sits under this loop — at the exit, not inside the round trips. Record N alongside the verdict as the width each round ran at, and the number of round trips the loop took; both are facts about the run, and neither is ever written as the reason a finding was adopted or dropped (see Design Dimensions, Every finding is adjudicated on its literal). If the judgment has settled, also append to decision structure per `skills/evolution-decision-structure-write` + Exit when either holds: this round returned no finding, or three round trips are done. Either way the loop ends here and step 9 follows. The cap is the bound: no `skills/model-loop-safety` judgment is run here, and no actor inside the loop counts toward convergence +9. **Externalize** - Record the verdict and the adoption judgment in the parent issue body / PR self-review. On the brake 1 path the self-review transcribes neither side of the exchange: the findings are the evaluator comments at step 3 and the adjudication the author's comments at step 7, both on the PR thread already. The parent reads that thread whole here, and records what it does not carry: the merge judgment over the eval, including whether a rejection left standing looks right. Record N alongside the verdict as the width each round ran at, and the number of round trips the loop took; neither is ever written as the reason a finding was adopted or dropped (see Design Dimensions, Every finding is adjudicated on its literal). If the judgment has settled, also append to decision structure per `skills/evolution-decision-structure-write` @@ -126,15 +126,13 @@ On that same path a measurement may be raised between the CI green a round rests Fixes the form every per-draft axis is written in — on the brake 1 path that is the pair Trigger, Axis selection names, held below at Held per-draft axes; at the Trigger moments outside brake 1 it is whatever axis the parent composes there, and the parts below are the requirement on that composition entire. The parts read on two surfaces now that the pair is held: they are the shape those literals are written in, and, for the two parts left open on them (`Unit` and `Scope`), they are the requirement on the parent's per-run fill. The section applies at Procedure step 3, where the axes enter the prompt. The fixed axis is outside it: that axis's wording is held whole at `skills/evolution-impression-literal-detection/SKILL.md` Prompt literal with no part left open, so nothing of it is filled per run. -The recurring form this closes is one axis name carrying more than one question — joined visibly, or compressed into a single predicate that reads as one. With the pair held, what is left to author per run is the `Unit` and `Scope` fill, and the parts below are what those fills are checked against. +Each axis ships as five labeled parts, all of them payload: they enter the evaluator's prompt as written, and a part left unwritten is a missing label in the text the evaluator reads. Each part is a phrase, not a paragraph; the form fixes what an axis names, not how much of it there is. -Each axis ships as five labeled parts, all of them payload — they enter the evaluator's prompt as written, and none is a check whose output is discarded once it passes. A part left unwritten is therefore a missing label in the text the evaluator will read. Each part is a phrase, not a paragraph; the form fixes what an axis names, not how much of it there is. - -- **Question** — one interrogative, and one only; it names the operation that produces its verdict, and it is answerable in the order its material arrives — an axis cannot ask for a judgment formed before reading what the prompt itself carries. Naming the operation means saying what the evaluator does to the material, and which result of doing it is the finding. Two clauses joined by "and" or by a comma are two operations and so two axes: split them, or drop one. What is counted is operations, not clauses: a predicate that names an evaluation instead of an operation — `forced`, `consistent`, `resolves wrongly` — carries its count hidden inside the one word, where the joined-clause prohibition cannot reach it. An interrogative that names no operation is unfilled, not answerable. The residual — a predicate whose reading the evaluator supplies silently, which emits no signal at all — is accepted on the post-merge observation axis (Non-scope). +- **Question** — one interrogative, and one only; it names the operation that produces its verdict, and it is answerable in the order its material arrives — an axis cannot ask for a judgment formed before reading what the prompt itself carries. Naming the operation means saying what the evaluator does to the material, and which result of doing it is the finding. Two clauses joined by "and" or by a comma are two operations and so two axes: split them, or drop one. What is counted is operations, not clauses: a predicate that names an evaluation instead of an operation — `forced`, `consistent`, `resolves wrongly` — hides its count inside the one word. An interrogative that names no operation is unfilled, not answerable. - **Unit** — what a single verdict covers: a sentence, a paragraph, a file, a claim, an occurrence. -- **Scope** — the surface the axis ranges over, stated on both of its dimensions — extent (this PR's diff, one named file, the repository, the repository and the wiki) and the language the axis's patterns are written in — and, where the axis's verdict is an absence claim, what it swept. An absence is only as wide as what was read. Extent alone does not carry the second dimension: a scope reading `the repository` is satisfied by a sweep that ran on English patterns alone, and this repository holds most normative text twice — English in `rules/` and `skills/`, Japanese in `docs/`. -- **Verdict terms** — what a yes and a no mean here, in this axis's own words. On an axis asking "did anything drop?" a finding answers yes while being negative for the draft; an axis that does not name its own polarity inherits the wrong one. -- **Basis** — every statement the axis makes about the target or about the criteria carries a pointer that resolves at the named SHA, is written inside every axis that needs it rather than once for the set, and, where the answer turns on how many of something there are, hands over the body to count from instead of a number. An axis does not inherit what was written next to it, and an axis that names no basis is unfilled, not clean. What resolving means: the criterion at its `path`, or quoted with `path:line`; an illustrative example quoted from where it actually occurs rather than composed to look like one. What this excludes is assertion from the parent's memory of a body the parent itself authored. The part is not satisfied by form alone, and what the per-axis requirement above ranges over is whatever the verdict has to be formed against — an existing Li+ criterion the axis is judging by, or an argument the parent is relying on. +- **Scope** — the surface the axis ranges over, stated on both of its dimensions — extent (this PR's diff, one named file, the repository, the repository and the wiki) and the language the axis's patterns are written in — and, where the axis's verdict is an absence claim, what it swept. Extent alone does not carry the second dimension: this repository holds most normative text twice — English in `rules/` and `skills/`, Japanese in `docs/` — so a scope reading `the repository` is not satisfied by an English-pattern sweep. +- **Verdict terms** — what a yes and a no mean here, in this axis's own words, its polarity named: on an axis asking "did anything drop?" a finding answers yes while being negative for the draft. +- **Basis** — every statement the axis makes about the target or about the criteria carries a pointer that resolves at the named SHA, is written inside every axis that needs it rather than once for the set, and, where the answer turns on how many of something there are, hands over the body to count from instead of a number. An axis that names no basis is unfilled, not clean. What resolving means: the criterion at its `path`, or quoted with `path:line`; an illustrative example quoted from where it actually occurs rather than composed to look like one. What this excludes is assertion from the parent's memory of a body the parent itself authored. What the per-axis requirement above ranges over is whatever the verdict has to be formed against — an existing Li+ criterion the axis is judging by, or an argument the parent is relying on. ### Held per-draft axes @@ -170,7 +168,7 @@ An axis whose parts were filled but filled loosely surfaces at adjudication, whe Fixes the form of the two artifacts brake 1 produces — the evaluator's findings comment at Procedure step 3, and the author's adjudication at Procedure step 7. Both land on the same PR thread, one answering the other. What this section fixes is delivery: it does not change which axes are asked (Trigger, Axis selection), how many evaluators answer them (Constraint: Evaluator floor), or what a finding is adjudicated on (Design Dimensions). -Scope = the brake 1 path. On the other Trigger entries there is no PR surface, so the evaluator returns its findings to the parent that spawned it and the held preamble below has no addressee; the asymmetry still governs what it writes. +Scope = the brake 1 path. On the other Trigger entries the evaluator returns its findings to the parent that spawned it and the held preamble below is not used; the asymmetry still governs what it writes. ### The asymmetry @@ -178,11 +176,11 @@ Both artifacts are asymmetric on the same seam: **the side carrying a finding is Full length = the verbatim quote of the literal at issue, its `path:line` at the named SHA, and why it is a defect. It is not a compression target. -One line = that same pointer without the quote, plus what the line is about and its verdict in the terms of whatever the verdict is on. Named at the SHA that pointer can be opened, and a pointer that does not resolve — or resolves to something the verdict does not fit — fails at one lookup. Residual = a clean axis whose pointer nobody opens, and a pointer picked after the verdict to fit it; accepted, on the post-merge observation axis the fixed axis's missed-literal case already uses (`skills/evolution-impression-literal-detection/SKILL.md` False-negative backstop). +One line = that same pointer without the quote, plus what the line is about and its verdict in the terms of whatever the verdict is on. Give the pointer at the SHA it opens at, and pick it before the verdict rather than to fit one. ### Evaluator's findings comment -One comment per evaluator per round, posted to the PR by the evaluator itself (`gh pr comment --repo / --body ...`). There is no consolidation step and no second hand between the evaluator and the author, so where N>1 put the round in, N comments land and duplicates across them are not merged: the author reads each on its own literal, and merging is a selection the loop no longer has an actor for. +One comment per evaluator per round, posted to the PR by the evaluator itself (`gh pr comment --repo / --body ...`). There is no consolidation step: where N>1 put the round in, N comments land, duplicates across them are not merged, and the author reads each on its own literal. - **Preamble**: the comment opens with one held literal, copied rather than composed: @@ -190,17 +188,17 @@ One comment per evaluator per round, posted to the PR by the evaluator itself (` Both clauses are payload; the evaluator does not restate them in its own words. The preamble is copied in the language the source has it in and is not rendered into the comment's resolved language. - **Axis with a finding**: full length, per the asymmetry above. -- **Axis with no finding**: name it and give its verdict in that axis's own terms. One answered by a repository-wide sweep has no line to point at, so the sweep substitutes for the pointer: give it re-runnably (the pattern, and the paths it ran over) and its hit count. Clean axes are carried in the comment all the same: the author reads every axis at Procedure step 6, and a comment carrying findings alone hides the denominator. +- **Axis with no finding**: name it and give its verdict in that axis's own terms. One answered by a repository-wide sweep has no line to point at, so the sweep substitutes for the pointer: give it re-runnably (the pattern, and the paths it ran over) and its hit count. Clean axes are carried in the comment all the same. - **Prohibited**: restating the criteria, thresholds, or axis wording the prompt supplied; and, in a round after the first, raising a finding already on the thread or one the author has rejected (Constraint: A rejection is final inside the loop). -- **Language**: the comment lands on a surface `Workspace_Language_Contract` (`adapter/claude/CLAUDE.md` / `adapter/codex/AGENTS.md`) reaches as a PR comment, and the evaluator writes it in the value its prompt names for this run (Procedure step 3, which fixes which side of that contract a PR comment resolves on) — a subagent cannot resolve that value from its own context. What resolution does not settle: a verbatim quote and its `path:line` stay as the source has them, and so does the held preamble above. Li+ source is English (`rules/model/liplus-coding-rule.md` Source Language), so in a workspace resolving to any other language this comment is mixed by construction — quotes in the source's language inside prose in the resolved one. A clean axis carries no quote, so its one line is prose and a pointer. +- **Language**: the comment lands on a surface `Workspace_Language_Contract` (`adapter/claude/CLAUDE.md` / `adapter/codex/AGENTS.md`) reaches as a PR comment, and the evaluator writes it in the value its prompt names for this run (Procedure step 3, which fixes which side of that contract a PR comment resolves on) — a subagent cannot resolve that value from its own context. What resolution does not settle: a verbatim quote and its `path:line` stay as the source has them, and so does the held preamble above. ### Author's adjudication Destination = a comment on the same PR thread, posted whether or not the round produced a commit. The commit that applies what was accepted still carries the body `rules/operations/operations.md` requires of it; what that body no longer carries is the adjudication. -- **Reject**: full length, and it is final inside the loop (Constraint: A rejection is final inside the loop). What stands behind it is the next round's evaluator, which reads the thread, and past the loop the parent's reading at Procedure step 9. +- **Reject**: full length, and it is final inside the loop (Constraint: A rejection is final inside the loop). - **Accept**: name the finding and what changed, and no more than that; what changed is externalized in the diff of the commit that carries it. -- **Language** resolves to the same value as the evaluator comment's, by the same seams — verbatim quotes stay as the source has them. The author does need it named: what its delegation prompt carried is the body language for the issue, PR and commit bodies it writes (`skills/task-subagent-prompt/SKILL.md` Delegation prompt hygiene), and a PR comment does not resolve on that axis. The parent names this one at the resume (`skills/task-subagent-prompt/SKILL.md` Resume-phase authority boundary, item (d)). +- **Language** resolves to the same value as the evaluator comment's, by the same seams — verbatim quotes stay as the source has them. The parent names it at the resume (`skills/task-subagent-prompt/SKILL.md` Resume-phase authority boundary, item (d)); the body language that delegation prompt carried (`skills/task-subagent-prompt/SKILL.md` Delegation prompt hygiene) is a different axis and does not resolve this. @@ -211,14 +209,14 @@ Destination = a comment on the same PR thread, posted whether or not the round p - **Evaluator floor = N=1**: The floor holds unchanged across M configurations. Reference Design Dimensions' `subagent_count` for N and run at minimum 1; N=1 is also the default (Design Dimensions, Default pattern). A round that returns no verdict has not met the floor and is re-run under Procedure step 7, Re-run - **Model floor = sonnet-class, explicit per spawn**: Every subagent spawned under this skill, on the mandatory brake 1 path or any other Trigger entry, explicitly sets the Agent tool `model` parameter. Implicit parent-model inheritance is prohibited. Default and floor = `sonnet`; a higher-class id (`opus`, `fable`) may be named but is not the default. `haiku` is prohibited as below floor. An id that cannot be positively classified as sonnet-class or above (unlisted, future, or versioned id of uncertain class) must not be passed; on doubt, fall back to the literal `sonnet`. Fix the floor per call, not via custom-agent frontmatter `model:` pinning. The evaluator floor is a separate axis and is unaffected by the model tier. `skills/task-subagent-spawn/SKILL.md` Subagent Model Policy carries the purpose split that scopes this requirement to brake evaluators only - **Subagent prompt must be self-contained**: Do not let parent context leak in. In the default M=all axes pattern, the prompt explicitly instructs each axis to "answer independently without referencing other axes' answers" to suppress cross-axis echo bias. If prompt complexity is high enough that the mitigation is uncertain, fall back to the M=1 axis-separated pattern (see Design Dimensions) -- **Evaluator does not modify the evaluation target**: the evaluator keeps its tool permissions, so the requirement is carried by the prompt rather than by the tool set (the rejected alternative is named in Non-scope). Copy this literal into every brake 1 evaluator prompt verbatim; do not re-compose it per spawn: +- **Evaluator does not modify the evaluation target**: the requirement is carried by the prompt, not by the tool set (the rejected alternative is named in Non-scope). Copy this literal into every brake 1 evaluator prompt verbatim; do not re-compose it per spawn: > Do not modify the evaluation target. Do not edit, write, commit, or push anything in the repository under evaluation, and do not run its build, tests, formatter, or any other command that mutates it. Read the PR diff and the file bodies at the named commit SHA. The one thing you write is your own findings comment on that PR: post it once, post nothing else there, and never a review, an approval, a merge, or a reply to anyone else's comment. If an axis looks like it needs a change applied before it can be answered, report that as a finding instead of applying it. - This literal and the material rule at Procedure step 3 are applied together. The literal carries no carve-out. The findings comment is the one exception written into it rather than left outside it, so "is a comment a modification?" is answered in the literal and not at the evaluator's discretion. -- **An evaluator receives the measurement's scope, never its verdict**: where a measurement ran before a round (`skills/evolution-rule-effect-measurement/SKILL.md` Application point), the prompt names what was put to it — the probes, or the positions of the lines exercised — and nothing of what came back. A difference, a zero difference, and a run that returned nothing are alike withheld, from the prompt, from the axes, and from every surface the evaluator is pointed at; the record of the run stays off the PR thread until the loop exits, because the evaluator reads that thread (Procedure step 3). Holding two instruments is worth something only while neither has spoken first: an evaluator told a region measured clean is told there is nothing there, and what goes missing is the finding it would have raised itself. Scope alone leaves it free to work the faces nothing has measured, under no pressure on the faces something has + This literal and the material rule at Procedure step 3 are applied together. The literal carries no carve-out: the findings comment is the one exception, written inside it rather than left to the evaluator's discretion. +- **An evaluator receives the measurement's scope, never its verdict**: where a measurement ran before a round (`skills/evolution-rule-effect-measurement/SKILL.md` Application point), the prompt names what was put to it — the probes, or the positions of the lines exercised — and nothing of what came back. A difference, a zero difference, and a run that returned nothing are alike withheld, from the prompt, from the axes, and from every surface the evaluator is pointed at; the record of the run stays off the PR thread until the loop exits, because the evaluator reads that thread (Procedure step 3) - **Findings are posted to the PR by the evaluator**: on the brake 1 path the evaluator posts its own findings comment and the author answers on the same thread. No consolidation step stands between them, and the parent neither composes nor reads what passes (Procedure steps 3, 4, 7, 8). -- **A rejection is final inside the loop**: once the author has rejected a finding with its reason on the thread, that finding is settled for the loop. No later round raises it again and the author does not re-adjudicate it. What this buys is the cap's usefulness: re-argument could fill all three round trips with one contested point, and the only actor able to settle such a standoff is the parent — which would put the adjudicator this loop takes out of the exchange back inside the cap. A rejection is examined at the exit instead, by the parent's reading at Procedure step 9. +- **A rejection is final inside the loop**: once the author has rejected a finding with its reason on the thread, that finding is settled for the loop. No later round raises it again and the author does not re-adjudicate it. A rejection is examined at the exit instead, by the parent's reading at Procedure step 9. - **Adjudication actor = the resumed implementation subagent**: the author of the change adjudicates the findings, resumed with its implementation context intact, and the parent retains self-review and the merge decision. Canonical statement, including why the always-delegate rule loses a branch rather than gaining an exception, is `rules/evolution/initiator-autonomy.md` Merge brake, Adjudication actor. Do not restate the reasoning here. Two boundaries carry into the resume prompt: the resumed author neither runs nor posts the self-review, and it does not merge (`skills/task-subagent-prompt/SKILL.md` Resume-phase authority boundary) - **Character_Instance non-inheritance**: What gets injected into subagent context = `CLAUDE.md` + `.claude/rules/**/*.md` (full body) + `.claude/skills/*/SKILL.md` (description only, body lazy-loaded at invoke) + MEMORY.md + harness-level system-reminders. `.claude/output-styles/`, hook firing output (SessionStart / UserPromptSubmit, etc.), and `.claude/settings.json` itself do not reach the subagent. `.claude/hooks/*.sh` script bodies are readable via the Read tool but not auto-loaded. When character behavior is part of the verification target, explicitly inject the Character_Instance body into the step 3 prompt. Running the character axis without injection produces the hollow prefix sleeping bug: persona absent, only the Character Instance name string generated