rule effect measurement conditions rest on observed failures - Liplus-Project/liplus-language GitHub Wiki

規則の効きの実測: 各条件は観測された失敗の上に置かれている

Question

skills/evolution-rule-effect-measurement/SKILL.md の各条件(適用点、パイプライン上の位置、二段構成、probe 仕様、段ごとに逆になる汚染対策、ゼロ差の 2 状態、判定役の分離、揺れの帯、腕のモデル、段2の走らせ方、ファイルを置く場合の囲い、自己適用)は、それぞれ何を根拠に置かれているか。

Current resolution

どの条件も、設計中または運用中に観測された失敗か実測値を根拠にしている。 本文は各条件を振る舞いとして持ち、その根拠(実測値・経緯・却下した案)はこの entry が持つ。#2088 の組み直し(#1604 の手順)で本文から移した。条件の本文そのものは skill 側が canonical であり、ここでは再掲しない。日本語の要旨は docs/2.-Evolution.md Rule Effect Measurement にある。

機構そのものの理由(#1848)

  • 非対称なコスト。 行を足すのは書き手一人で済むが、消すには評価者に「この行は load-bearing でない」ことを示す必要があり、これは無いことの証明であって原理的に示せない。rules/model/subtractive-structural-beauty.md Core principle (C) が反射と名指す preserve-by-default が、削除に論証を要求するゲートの構造そのものに埋まっていた。Master の観測では、短縮は数回試みられたが定着しなかった。原因は意志ではなく構造側にある、という見立てがこの機構の起点である。実測は論証を観測へ置き換える。
  • brake 1 とは両向きで別の面を押さえる。 #1849(skills/model-agentic-search 蒸留)の測定で、conduct 行 2 行の脱落(A-2)は測定の網の外で起き brake 1 が拾い、rules/model/character.md の再掲行(第2周 Q3)は brake 1 の網の外で起き測定が拾った。本文の「どちらも他方を置き換えない」はこの 2 件に拠る。
  • 旧本文の冒頭にあった「設計判断の正当化は Decision Structure entry が持つ」という一行は、ポインタ要件の撤廃(judgment-record-pointer-requirement-dropped、跡は空のまま閉じる)に沿って #2088 で除いた。実際、それまで専用の entry は無かった。

適用点(#1848)

空の木を相手にした一行ずつの入場試験はほとんどすべてを通す。単独で無意味な行は少なく、膨張を作っているのは重複だからである。既存本文の上での限界効果を問う形(比較相手 = 今の全部を載せた木)でないと噛まない。

パイプライン上の位置(#1857 / PR #1869)

  • CI green の後、brake 1 の前。 CI の前に測ると、評価者が読む本文とは別の本文を測ることになる。
  • 実行主体が親である理由。 その位置で材料を握り、評価者の spawn をスケジュールしているのは親である。別の主体に割ると同じ材料を二者が別々に組む。腕は claude -p の別プロセスなので、親と腕の間に subagent を一段挟んでも腕の起こし方は変わらない。
  • 加算側の PR を測らない理由。 測って得られるのは「足した分が効いている」であり、それは争点になっていない。
  • 未測定の記録。 空欄は読む側に「問題なし」と読まれ、判定の不在が判定として働く。記録先を親のセルフレビュー記録にしたのは、brake 1 が抜けた後に書かれる面なので評価者へ届かないためである。

バイトの腕(#1934 / PR #1960)

  • 行だけを数える発火条件は、長い文を短い文へ差し替える削りを拾えない。差し替えは追加 1・削除 1 として両側に立つため行数が釣り合い、内容だけが抜ける。これは rules/model/liplus-coding-rule.md Body States Behavior に沿った削り(挙動の文を残して導出を剥ぐため節の行数が残る)の典型形である。#1934 の実測では、同日マージの蒸留 PR 3 本のうち最もバイトを削った #1925(18 行対 18 行、-4,734 B)だけが発火していなかった。
  • バイトの腕は言語に依らない。issue 本文は「Source Language が統治面を英語に固定するから安全」と論じたが、実測で狭めた。adapter/** のフックスクリプトは非 ASCII 文字列を出力する(adapter/claude/hooks/on-session-start.sh だけで非 ASCII を含む行が 1,371)。腕を支えているのは比較が 1 本の diff の内側で閉じていること(当該 PR の追加分を当該 PR 自身の削除分に当てる)である。Source Language が担うのは、散文の差し替えで比較の両側を同一言語に保つ点だけにとどまる。
  • 数える範囲の書き方は #2000 / PR #2002 の brake 1(B-1)で直した。旧文は docs/** が統治面でないことを rules/evolution/initiator-autonomy.md Governed surface に拠らせていたが、同 PR で記録面の除外が条件付きになったため、発火条件が名指すパスに拠る形へ変えた。

二段構成と段1の貼り付け(#1848)

段1では「ファイルから読ませる」と「プロンプトに貼る」で結果が変わらなかった(各 3 本、結論も導出の文言もほぼ同一)。貼り付けは偽の規則ファイルを一度も作らないため既定とし、囲いの条件はファイルを置く例外時だけに掛ける。

probe 仕様

  • 一文を先に確定させる理由(#1848)。 ゼロ差での却下が正当になるのは、狙いを書き手自身が先に決めた場合だけである。差が出るまで一文を引き直せるなら、その作業は行の仕事を測っているのではなく、通る言い方を探している。一文の事前確定そのものは rules/model/liplus-coding-rule.md Application-moment sentence(L1、常時ロード)が持ち、skill は probe をそこから起こすことだけを持つ。
  • 内容照合と行動照合が割れる形(#1853 / PR #1868)。 常時ロード側の規則を再掲した行は、本文からは消えても行動は変わらない。内容照合は差ありと出し、conduct は同じである。#1849 第2周 Q3(A 3/3「規定あり」、B 3/3「本文に規定なし」、内容は rules/model/character.md Character Output の再掲)が実例である。
  • 二つを別の形で書く理由。 行動設問を内容設問の文言を緩めて書くと、本文参照の指示が弱まった形で残り、併用が単軸へ戻る。
  • 落ちた行に立てられるのは行動照合だけ。 本文から消えた行について「本文に何と書いてあるか」は問いにならない。conduct 行の脱落が内容照合だけの周を素通りしたのはこのためである(#1849 A-2)。
  • blind は 1 周だけ、設問文を変更側に見せない(#2014 / PR #2055)。 PR #2012 の測定で一つの probe が三重に焼けた。(1) 作成者が採点で arm B の出力を見た。(2) 作成者が設問文を部屋に貼り、蒸留側が読んだ。(3) 蒸留側がその設問の語形で実装側へ指示を出した。同じ組での再測定は走行記録の形も手順も 1 回目と同一で、外からは区別がつかない。(2)(3) は測定手順ではなく対話の運用で起きたため、置き場所の制約として置いた。検出の構造化は後続とした。

汚染対策(#1848)

  • 段1の literal は Opus 3/3 で遵守された(tool_uses = 0、パスの名指しなし、推測補完なし)。
  • 経路の列挙(ブラックリスト)を捨てた根拠は、本文へ流入する経路が少なくとも 4 つ観測されたことである。description 経路では、腕が何も読まずに参照先を正確に名指しした。外部 RAG 経路では、ファイルを 1 つも開かずに完答した。RAG が返すのは過去時点のスナップショットなので、腕ごとに別の時点の本文を読みうるため、対照が静かに崩れる。
  • 「すでに持っている情報だけで答えよ」は、description が「すでに持っている情報」に含まれるため、閉じたい穴を文面自身が開ける。
  • 段2で外部取得を禁じる理由は RAG である。腕 B から削った行が索引に残っており、腕がそこから取り戻せば対照が崩れる。
  • 隔離(作業木を外に置く、ディスク経路を deny する)が効かないのは、本文がネットワーク越しにも存在し、囲える対象ではないためである。

ゼロ差の 2 状態(#1848)

注入方式は、gist 想起の誤りを打ち消すために置かれた行を構造的に過小検出する。腕は短い本文を目の前に置いて読むが、その種の行が効く条件は本文を逐語で読んでいない状態である。Li+ にはこの類型が多く(rules/model/trigger-check-gate.md 系)、区別しないまま運用するとこの類型が一律で落ちる。

判定役(#1848、#1924 / PR #1966、#2013 / PR #2054)

  • 穴の報告を効きに数えない理由。 意図的に欠落させた条件で 3/3 漏れなしだった。3 本とも「この規則には当該定義が無い」と自発的に申告し、1 本は「常時ロード側には記述があるが参照を禁じられているので使っていない」と明記した。この腕は無知ではなく、穴に気づいたうえで自制した腕であり、出力が穴の報告になる。A と B の差が一行ぶんの判断の差なのか、穴に気づいたという事実なのかは別物である。
  • probe で穴への言及を封じない理由。 気づきは消えず、消えるのは兆候だけである。その兆候こそ漏れの有無を判別した当のものなので、封じると検出器を自ら壊す。直すのは判定役の分離である。
  • 判定を scope の中に書く理由。 部分測定(PR #2012 の 30 問中 8 問、#1851 の 5 問)が射程を対話にしか残さず、走行記録が全面測定として読まれた。射程を人が書き添える手順にすると書き忘れても何も落ちないため、plan の必須フィールドにした(構造への置き換え)。

揺れの帯(#1848、#1924 / PR #1966、#1853)

  • 旧仕様の「同一条件を先に空回しする」は plan として表現できない。EDIT_BUDGET が二腕の edit を合計ちょうど 1 に固定し、assert_single_contrast が構築後の木を digest で比べて相違ファイルがちょうど 1 であることを再検査する。差分ゼロの組は(drop と replace_with が同じ文字列でも)両方で拒否される。この二つが差分ゼロの組を対照として採点させない装置なので、それを外すのではなく、対照 run が既に積んでいる腕内反復から帯を読む形に変えた。
  • 帯 0 の実測は rules/operations/release-version-rule.md Important note の段1測定(#1848 1 回目)で、12 本すべてが patch で一致した。理由文の文面は毎回異なったので、帯 0 は離散判定の軸に限る。
  • 行動軸の帯は未測定である(#1853 残差 3)。離散的な行動選択に落ちる設問なら同じ帯を持つ見込みだが、見込みは測定ではない。

腕のモデル(#1848)

同一 probe・同一ワークスペースで、haiku は 0/3 漏れなし・ツール使用 0、Opus は 1/1 漏れで RAG から完答した。弱いモデルは取得もしない代わりに節の適用もしないため、差が過小に出る。

段2の走らせ方(#1848、#1900 / PR #1981、#1944 / PR #1949、#2011 / PR #2041、#2013 / PR #2054)

  • 腕が別プロセスである理由。 subagent が読むのは親セッション起動時の規則本文で、実行中のディスク変更は追加・削除とも届かなかった(両方向で実測、全試行でツール使用 0)。不採用にした構成は、Explore やカスタムエージェントの skills preload で腕を作る形である。腕の選択基準は「上書きできるか」ではなく「対象について無知でいられるか」であり、複製木 + claude -p がそれを満たす。削除試験の腕はディスクとコンテキストが食い違った状態で迷わずコンテキスト側を採り、食い違いを検知しなかった。
  • 走行物ゼロ。 排他ロック(os.mkdir 一発)、temp 下の固定パス、finally での削除、冒頭の無条件削除の二枚構え。ロックの PID 化と stale 判定は #1945 で組み直した(docs/2.-Evolution.md が経緯を持つ)。
  • 窓の印で複製を止める(#1900 / PR #1981)。 以前は status を走行記録の横に記録するだけで、開いた印が複製を止めなかった。brake 1 round 1 の指摘で、issue が求めていない「ポーリング間隔と諦め回数を走行ごとに選んで記録する」条項を落とし、unmeasured の理由文言を両節で window open に揃えた。逆方向(brake 1 が測定の窓を確かめる)は範囲外とした。
  • harness の構造保証の由来。 二腕・相違 1 箇所は #1848 の対照の原則(丸腰の腕と比べると差の帰属先が決まらない)。アンカー一致ちょうど 1 回は PR #1867(0 回なら同一の木を比べて偽陰性を出し、真の陰性と区別できない)。モデルの既定値なしは腕のモデルの実測。hook の除去は、session-start hook の出力が第二の相違になるため。.git を複製しないのは、remote を消す手順ではなく構成として持たないため。--out 必須は #2011(record が各 edit の本文を丸ごと持つので、--out を付け忘れると、通常 arm B を見ない側に置かれる実行者の端末へ arm B の本文が出て、走行は exit 0 のまま測定だけが成立しなくなる)。exit 4 は #1944(全 arm が非ゼロの run が exit 0 を返し、「測定が走った」と二人続けて誤読された)。scope 必須は #2013。
  • コストの床。 最小プロンプトの腕 1 本で cache_creation_input_tokens = 95,069。常時ロード側の読み込み分であり、probe の長さにほぼ依存しない。5 問 × 3 回 × 2 腕 = 30 起動が 1 周の規模である。これが測定を必須にしない根拠である。

ファイルを置く場合の囲い(#1848)

腕の 1 本が、ファイル内の「実験用に作った写し」という記述を読み、判定は実運用向けではないと付記した。本文に残した「Measured: an arm read a note ...」の一文は、scripts/measure_rule_effect.py の自己申告ガードの根拠として、同スクリプトのコメントと tests/test_measure_rule_effect.py が逐語で参照しているため、本文から動かさない。

自己適用と外側の位置(#1848)

  • 設計の穴が見つかるたびに条件が一つ増える形は、この門が測ろうとしている膨張と同じ構造である。
  • 適用実績: 「両変種を両腕のワークスペースに置く」を不採用にした。命名と置き場の条件が満たされていれば、片方だけを置いても載る文面は同一で名前は無情報なので、適用の瞬間に何も変わらない。
  • 設計中、経路の漏れが見つかるたびに AI 側は条件を一つ足す方向にしか動かなかった。「経路を数えるのをやめ、許可を一つだけ挙げる」という解は、設計に参加していない Master から出た。積み上げた本人には、積み上げをやめる手が見えにくい。

Edges

Related

  • #1848 / PR #1867 — 機構本体(ハーネス、skill、一文の事前確定)
  • #1853 / PR #1868 — 行動照合
  • #1857 / PR #1869 — パイプライン上の位置
  • #1934 / PR #1960 — バイトの腕
  • #1944 / PR #1949 — exit 4
  • #1924 / PR #1966 — 腕内反復から帯を読む
  • #1900 / PR #1981 — 窓の印で複製を止める
  • #2000 / PR #2002 — 数える範囲の書き方
  • #2011 / PR #2041 — --out 必須
  • #2013 / PR #2054 — scope 必須
  • #2014 / PR #2055 — blind 1 周、設問文の置き場
  • #2088 — 本文から根拠をこの entry へ移した組み直し(#1604 の手順)