Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/2.-Evolution.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ state file は `{workspace_root}/.claude/state/last-cold-start-emit.json`(sha2
Li+ source の説明文が積み上がり続ける問題に対し、削除・追加の判断を議論ではなく実測で行う門である。非対称なコストがこの機構の理由である——加算は書き手一人で済むが、減算は評価者に「この行は load-bearing でない」ことを示す必要があり、これは無いことの証明であって原理的に示せない。`rules/model/subtractive-structural-beauty.md` Core principle (C) が名指す preserve-by-default が、削除に論証を要求するあらゆるゲートの構造そのものに埋まっている。

- **適用点**は新規追加の門であり、既存節の総掃きではない。比較相手は「今の全部を載せた木」であって空ではない(重複検出器)。単体で無意味な行は少なく、空を相手にした一行ずつの入場試験はほぼ全部を通す。膨張を作っているのは重複だからである。既存の掃き出しは余力での後追い
- **自己進化 PR のパイプライン上の位置**は 実装 → CI → 実測 → brake 1 である。CI green の後、brake 1 の評価者 spawn の前に起こす。評価者が受け取るのと同じ基準点に載せるためであり、CI より前に測ると測った本文と評価される本文がずれる。**実行主体は親**である——その位置で材料を握り評価者の spawn をスケジュールしているのは親であり、別主体に割ると同じ材料を二つの主体が別々に組むことになる。腕は `claude -p` の別プロセスなので subagent を一段挟んでも腕の起こし方は変わらない。判定役の分離はこれで動かない(親が起こすのは走行であって判定ではない)。**発火条件**は、統治対象の本文(`rules/**` / `skills/**` / `adapter/**`)において削除行が追加行を上回る PR である。行を増やす PR を測っても得られるのは「増えた行が効いている」であり、それは争点になっていない。自己申告は採らず、余白に閾値も設けない
- **自己進化 PR のパイプライン上の位置**は 実装 → CI → 実測 → brake 1 である。CI green の後、brake 1 の評価者 spawn の前に起こす。評価者が受け取るのと同じ基準点に載せるためであり、CI より前に測ると測った本文と評価される本文がずれる。**実行主体は親**である——その位置で材料を握り評価者の spawn をスケジュールしているのは親であり、別主体に割ると同じ材料を二つの主体が別々に組むことになる。腕は `claude -p` の別プロセスなので subagent を一段挟んでも腕の起こし方は変わらない。判定役の分離はこれで動かない(親が起こすのは走行であって判定ではない)。**発火条件**は、統治対象の本文(`rules/**` / `skills/**` / `adapter/**`)において削除が追加を上回る PR であり、腕は二本で**いずれか一方**が満たせば発火する——削除行が追加行を上回る、または削除バイトが追加バイトを上回る。どちらも満たさない PR を測っても得られるのは「増えた分が効いている」であり、それは争点になっていない。自己申告は採らず、どちらの腕にも余白の閾値を設けない(行の腕と同じく 0 を境に比較する)。バイトの腕は行の腕の精密化ではなく、行の腕が構造的に届かない削り方を拾う——長い文を短い文へ差し替える形は追加 1・削除 1 として両側に立つため行数が釣り合い、内容だけが抜ける。これは `rules/model/liplus-coding-rule.md` Body States Behavior に沿った削りの典型形である(挙動の文を残して導出を剥ぐため、節に行が残る)。どちらの腕も統治面だけを、かつその 1 本の diff の内側で数える——当該 PR の追加分を当該 PR 自身の削除分に当てるのであって、ファイル間・PR 間・言語間を跨いで比較しない。したがってどちらの腕も「統治面が単一言語である」ことには依っていない(実測でもそうではない——adapter のフックスクリプトは非 ASCII の文字列を出力する)。`rules/model/liplus-coding-rule.md` Source Language がバイトの腕に対して担うのはもっと狭い——散文の差し替えにおいて比較の両側を同一言語に保つことであり、それによりバイト差が符号化の差ではなく内容の減少として読める。`docs/**` は統治面に入らない(`rules/evolution/initiator-autonomy.md` Governed surface)。#1934
- **二段構成**。段1 = 対象本文の抜粋を親プロンプトに注入する安い篩い。差が出れば load-bearing 確定、ゼロ差は段2へ送る**振り分け**であって判定ではない。段2 = ライブ木から `.claude/` + `CLAUDE.md` + `Li+config.md` を複製した面を2つ作り、一箇所だけ変えて `claude -p` を起こす。本番同等の密度でなおゼロ差なら重複として落とす
- **段1のゼロ差を削除根拠にしてはならない**。ゼロ差は2状態を混同している——(a) 注入が本番の読み条件を壊したための過小検出、(b) その行が実際に重複。注入方式は gist 想起の誤りを打ち消すために置かれた行を構造的に過小検出する(腕は短い本文を目の前に置いて読むが、その種の行が効く条件は本文を literal で読んでいない状態である)。Li+ にはこの類型が多く(`rules/model/trigger-check-gate.md` 系)、区別しないと一律で落ちる。切り分けが段2の存在理由である
- **汚染対策は段ごとに逆になる**ため制約文を共有しない。段1 = 親プロンプトの内容だけを情報源とするホワイトリスト形(文言は skill 側に canonical literal として保持。経路の列挙=ブラックリストは、本文への流入経路が少なくとも4つ(ワークスペースの `.claude/`、`liplus-language/` 側の同一本文、コンテキスト上の skill `description`、外部 RAG 索引)あり次が出るたびに破れる)。段2 = 常時ロードされた本文を使うことが目的なのでホワイトリストは使えず、制約は「外部から取得しない。手元に載っているものだけで答える」。段2で外部取得を禁じる理由は RAG であり、削った行が索引には残るため腕が取り戻すと対照が崩れる
Expand Down
6 changes: 5 additions & 1 deletion skills/evolution-rule-effect-measurement/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@ Canonical for where this gate fires on that pipeline. The order is implementatio

Actor = the parent. At this position it is already holding that material and scheduling the evaluator spawn, so no other actor rebuilds the same material. The arms are separate `claude -p` processes (Running stage 2), and putting a subagent between the parent and an arm changes nothing about how the arm is raised. Judge separation below is untouched by this: what the parent raises is the run, not the verdict.

Firing condition = a PR whose diff over the governed body (`rules/**` / `skills/**` / `adapter/**`) deletes more lines than it adds. A PR that adds lines is not measured here: the result would be that the added lines are working, which is not the claim in dispute. Self-report is not accepted in place of the diff, and no threshold is set on the margin.
Firing condition = a PR whose diff over the governed body (`rules/**` / `skills/**` / `adapter/**`) deletes more than it adds on **either** of two arms: deleted lines exceed added lines, or deleted bytes exceed added bytes. Either arm alone fires the condition. A PR that exceeds on neither is not measured here: the result would be that the added material is working, which is not the claim in dispute. Self-report is not accepted in place of the diff, and no threshold is set on either margin — both arms compare at zero, as the line arm already did.

The byte arm is not a refinement of the line arm; it reaches a strip the line arm cannot. Replacing a long sentence with a short one stands on both sides of the diff as one addition and one deletion, so the line counts balance while content leaves. That shape is the typical one for a strip under `rules/model/liplus-coding-rule.md` Body States Behavior, which keeps the conduct sentence in place and takes the derivation off it — the section keeps its lines.

Both arms are counted over the governed body only (`docs/**` is not governed body — `rules/evolution/initiator-autonomy.md` Governed surface), and each is counted inside that one diff: added material against this PR's own deleted material, never across files, PRs or languages. Neither arm therefore rests on the governed body being uniformly one language, and measured it is not — the adapter hook scripts emit non-ASCII strings. What `rules/model/liplus-coding-rule.md` Source Language carries for the byte arm is narrower than that: it keeps a prose replacement in one language on both sides of its own comparison, so the byte delta reads as content removed rather than as an encoding change.

The run is not mandatory. Measurement consumes external budget (Running stage 2), so a run that cannot be taken does not hold the merge gate — proceed to brake 1 without it. What holds instead is the record: write `unmeasured` with its reason — spend limit, outside the firing condition, or nothing in the diff to raise a probe over — into the parent's self-review record (`rules/operations/main-agent-procedures.md` Self-review formal record). Never leave it blank and never record it as a negative result. A blank is read as no problem, which makes the absence of a verdict work as a verdict. That record is written after brake 1 has exited, so nothing in it reaches an evaluator.

Expand Down
Loading