Skip to content

spec(measurement): fire the measurement gate on lines or bytes - #1960

Merged
smileygames merged 2 commits into
mainfrom
1934-specmeasurement-firing-condition-counts-lines-so-a-replace-in-place-strip-never-fires
Sep 12, 2026
Merged

smileygames merged 2 commits into
mainfrom
1934-specmeasurement-firing-condition-counts-lines-so-a-replace-in-place-strip-never-fires

Conversation

@smileygames

Copy link
Copy Markdown
Member

Closes #1934

何を変えたか

skills/evolution-rule-effect-measurement/SKILL.md Application point, Position on the self-evolution PR pipeline の発火条件を、行だけの単腕から二腕にした。

  • 削除行が追加行を上回る または 削除バイトが追加バイトを上回る → 発火
  • いずれか一方で足りる
  • 閾値は新設していない。 バイトの腕も行の腕と同じく 0 を境に比較する

issue の方針 (a) をそのまま採った。(b)(行を単位にしたまま内容量を測る)は行という単位が内容量を運んでいないため結局 (a) に収束し、(c)(意図側で書く)は発火判定を著者の申告に委ねるため、量の指標が著者から独立している点を失う。

なぜ

差し替え形の削り(長い文を短い文へ)は追加 1・削除 1 として両側に立つため、行数が釣り合って発火しない。これは rules/model/liplus-coding-rule.md Body States Behavior に沿った削り——挙動の文を残して導出を剥ぐ——の典型形であり、この器具が duplicate detector として測る対象そのものである。issue の実測では、同日マージの蒸留 PR 3 本のうち最もバイトを削った #1925(18 対 18、−4,734 バイト)だけが発火していなかった。

検算: #1925 はバイトの腕で発火する。既に発火していた #1927 / #1933 はどちらの腕でも発火するため判定は変わらない。

論拠を実測で狭めた点(issue 本文からの差分)

issue 本文は「バイトの言語依存は rules/model/liplus-coding-rule.md Source Language が統治面を英語に固定するので閉じている」としていた。これを実測で確認したところ、adapter/** は散文だけではない——origin/main.sh 6 / .ps1 3 / .toml 2 / .md 6 を持ち、フックスクリプトは非 ASCII 文字列を大量に出力する(adapter/claude/hooks/on-session-start.sh だけで非 ASCII を含む行が 1371)。統治面はバイト水準で単一言語ではない。

実際に腕を支えているのは、比較が 1 本の diff の内側で閉じていることである——当該 PR の追加分を当該 PR 自身の削除分に当てるのであって、ファイル間・PR 間・言語間を跨がない。Source Language が担うのはより狭く、散文の差し替えで比較の両側を同一言語に保つ点に留まる(バイト差が符号化の差ではなく内容の減少として読める)。本文はその狭い形で書いた。

非散文ファイルで腕が誤って発火する/しない形は見つかっていない。多バイト content 上ではバイトの腕の感度が上がるが、この条件は閾値を持たない粗い検出器であり、その先の実測は任意かつ merge を gate しないため、過剰発火のコストは任意の走行 1 本である。塞ごうとしていた欠陥は過少発火の側である。

範囲

  • 統治面の列挙(rules/** / skills/** / adapter/**)は動かしていない
  • 記録側(unmeasured を空白にしない規定)は触っていない
  • L1 Model Layer source は触っていない
  • tests/ は追加していない。検査対象が判定手順であって source の性質ではないため
  • docs/2.-Evolution.md の対応記述を同一 PR で更新

本 PR 自身の発火判定

変更前の条件で判定する。統治面の diff は追加 6 / 削除 2 で追加超過のため、行の腕で発火しない。release type は patch 見込み(発火条件の測り方の修正であり、観測可能な大規模変更ではない)。最終判断は self-review 時。

🤖 Generated with Claude Code

https://claude.ai/code/session_012f9ANtiSsDEaFwk3uMNA3f

… counts

`skills/evolution-rule-effect-measurement/SKILL.md` Application point,
Position on the self-evolution PR pipeline の発火条件を二腕にした。削除行が
追加行を上回る、または削除バイトが追加バイトを上回る、の**いずれか**で発火する。

行だけを数える条件は、長い文を短い文へ差し替える形の削りを拾えない。差し替えは
追加 1・削除 1 として両側に立つため行数が釣り合うからである。これは
`rules/model/liplus-coding-rule.md` Body States Behavior に沿った削り
(挙動の文を残して導出を剥ぐ)の典型形であり、この器具が duplicate detector
として測ろうとしている当のものである。#1934 の実測では、同日マージの蒸留 PR 3 本の
うち最もバイトを削った #1925(18 対 18、-4,734 バイト)だけが発火していなかった。

閾値は新設していない。バイトの腕も行の腕と同じく 0 を境に比較する。

バイトの言語依存について、issue 本文の論拠(Source Language が統治面を英語に
固定するから安全)は実測で狭めた。`adapter/**` は散文だけではなく、フック
スクリプトは非 ASCII 文字列を出力する(`adapter/claude/hooks/on-session-start.sh`
だけで非 ASCII を含む行が 1371)。実際に腕を支えているのは比較が 1 本の diff の
内側で閉じていること(当該 PR の追加分を当該 PR 自身の削除分に当てる)であり、
Source Language が担うのは散文の差し替えで比較の両側を同一言語に保つ点に留まる。
本文はその狭い形で書いた。

docs/2.-Evolution.md の対応記述も同一 PR で更新した。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012f9ANtiSsDEaFwk3uMNA3f
@smileygames

Copy link
Copy Markdown
Member Author

Adjudicate each finding below by checking its literal against the source at the revision its path:line is given at, and adopt or drop it on that. No count enters that judgment, and no axis is exempt from it: the fixed impression-literal axis is adjudicated the same way, on the flagged phrase against the removal test its own spec fixes (skills/evolution-impression-literal-detection/SKILL.md), and it fixes no threshold.

Axis A — issue requirement

所見無し。issue #1934 の本文(購読対象: PR がクローズする issue)と、この diff(6bc85f317777d38b056ac06cd4db7be9b8f3f45c)を突き合わせた。

  • issue「方針(2026-09-12 確定)」節の "(a) を採る。行数かバイト数の いずれか で削除超過なら発火する、二腕の条件にする。閾値は新設しない。" は skills/evolution-rule-effect-measurement/SKILL.md:35("deletes more than it adds on either of two arms: deleted lines exceed added lines, or deleted bytes exceed added bytes... no threshold is set on either margin")と一致。
  • issue「バイトの言語依存について」節の "統治面は rules/** / skills/** / adapter/** であり... したがって比較は同一言語内で閉じる...条件文には...その規則への参照として書く" は SKILL.md:39rules/model/liplus-coding-rule.md Source Language への参照の形)と一致。
  • issue「constraints」の 4 項目(新閾値を持ち込まない/統治面の列挙を動かさない/記録側を触らない/L1 を触らない)はいずれも diff で守られている——SKILL.md の Governed surface 列挙(rules/** / skills/** / adapter/**)は無変更、41 行目の unmeasured 記録規定も無変更、L1 Model Layer source(rules/model/**)への変更も無い。
  • issue「target files」の docs/ 更新は同一 PR 内の docs/2.-Evolution.md 更新で満たされている(同じ二腕の説明が反映済み)。
  • issue「target files」の tests/** は「足さない判断も妥当」としており、diff は tests/** を変更していない——issue が許容した選択の範囲内。
  • PR 本文が issue 本文の一前提(バイトの言語依存の閉じ方の根拠)を実測で狭めた旨を書いている点も、diff(SKILL.md:39 の "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")と PR 本文の記述が一致しており、issue 側の前提記述との間に矛盾は残らない(issue 側もこの訂正を "実測で確認したところ" として自ら記録済み)。

読んだもの: issue #1934 本文全文(日本語)、PR #1960 本文全文(日本語)、diff 全体(docs/2.-Evolution.md 日本語部分・skills/evolution-rule-effect-measurement/SKILL.md 英語部分の両方)。

Axis B — rule violation

所見無し。diff が変更・追加した全行(docs/2.-Evolution.md 1 段落改稿、skills/evolution-rule-effect-measurement/SKILL.md:35,37,39 の新規 3 段落)を、rules/** および skills/** at 6bc85f317777d38b056ac06cd4db7be9b8f3f45c に照らして確認した。

  • SKILL.md:39 が引く rules/evolution/initiator-autonomy.md:35(Governed surface, Excluded, Record surfaces: "docs/**, ... Nothing here is loaded as instruction")と、diff の "docs/** is not governed body" は整合。
  • SKILL.md:37,39 が引く rules/model/liplus-coding-rule.md(Body States Behavior / Source Language 節)の記述と、diff の要約("keeps the conduct sentence in place and takes the derivation off it" / "keeps a prose replacement in one language on both sides of its own comparison")は原文の主張範囲を超えていない。
  • リポジトリ全体を deletes more lines than it adds / firing condition でスイープし(grep -rnrules/** skills/** docs/** 対象)、旧発火条件の逐語再掲が他ファイルに残っていないことを確認した(ヒットは rules/evolution/initiator-autonomy.md:70skills/evolution-full-run/SKILL.md:27 のみで、いずれも当該条件の内容を再掲していないポインタ参照)——rules/operations/main-agent-procedures.md The bar and its pair が禁じる「二つ目の写しが drift する」形には当たらない。
  • docs/2.-Evolution.md:313 末尾の #1934 引用は、同ファイルの既存の書式(#1239 #1894 #1911 #1845 #1852 等、多数の issue/PR 番号引用が既に地の文に載っている)と一致しており、逸脱ではない。

Fixed axis — impression-literal detection

対象: skills/evolution-rule-effect-measurement/SKILL.md の追加・改稿行(docs/** はこの軸のスコープ外——同 skill の Scope が rules/**/*.md / skills/**/SKILL.md / adapter/**/* / Li+update.md に限定)。旧 1 行を置き換えた新規 3 段落(SKILL.md:35, SKILL.md:37, SKILL.md:39)を対象に除去テストを適用した。

  • SKILL.md:35(発火条件本体): 除去すると発火条件そのものが消え、振る舞い意味が変わる。旗なし。
  • SKILL.md:37(バイト腕は精密化ではなく別の削り方を拾うという説明): 除去しても :35 の発火条件は独立に機能するが、この段落は Negative list の「Explanatory rationale that prevents a known misinterpretation」に該当すると判断した——バイト腕を「行の腕の重複」と誤読して将来 duplicate detector 自身に削られることを防ぐ根拠を運んでいる。旗なし。
  • SKILL.md:39(統治面限定・diff 内限定の説明、および言語非依存の実測根拠): 前半("counted over the governed body only" / "never across files, PRs or languages")は計数対象を確定する振る舞い規定であり除去で意味が変わる。後半("measured it is not — the adapter hook scripts emit non-ASCII strings")は同じく Negative list の保護対象——issue が挙げた「バイトは言語依存」という懸念への反証であり、除去すると将来同じ懸念が根拠なく再燃しうる。旗なし。

掃いた対象: skills/evolution-rule-effect-measurement/SKILL.md の追加・改稿行 3 段落(旧 1 行 → 新 3 段落、diff 上の追加行はヘッダ含め 6 行)。旗は立たなかった。

…-lines-so-a-replace-in-place-strip-never-fires

@smileygames smileygames left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI self-review (parent)

受け入れ基準: issue #1934 の方針 (a) —— 発火条件を行数の一腕からバイト腕を足した二腕にし、どちらか一方で削除超過なら発火する形にする —— が skills/evolution-rule-effect-measurement/SKILL.md に入り、docs/2.-Evolution.md が同一 PR で追随している。issue の constraints 4 点(新しい数値閾値を持ち込まない / 統治面の列挙を動かさない / unmeasured の記録規定を触らない / L1 を触らない)はいずれも守られている。両腕とも 0 を境にした比較のままで、新しい数値は入っていない。

scope 逸脱: なし。

issue 本文の前提を 1 つ訂正して実装されている点: 私が issue に書いた根拠——「rules/model/liplus-coding-rule.md Source Language が統治面を英語に固定しているからバイト比較は同一言語内で閉じる」——は事実として誤っていた。実装側が中身を実測し、adapter/claude/hooks/on-session-start.sh だけで非 ASCII を含む行が 1371 行(出力される日本語文字列と罫線)あることを示した。条文はこの訂正を反映して、狭い形で書かれている: 両腕とも同一 diff 内で数え、ファイルも PR も言語も跨がないので、そもそも単一言語性に依拠しない。Source Language が担うのは「散文の差し替えなら比較の両端が同じ言語に揃う」という狭い仕事だけ。条文を開いて確認した。訂正の向きは正しく、条文は検証された範囲までしか主張していない。 誤った前提を書いたのは私の側であり、self-eval に記録済み。

brake 1: 実施済み。round trip 1 本、width N=1。3 軸すべて所見なしで返ったため著者の resume は行わず step 8 で exit。thread 通読済み、standing rejection なし。評価者は固定軸で説明 2 段落を Negative リストの「既知の誤読を防ぐ説明的根拠」として保護側に置いており、私の読みも同じ —— どちらもバイト腕が行腕の細分化だと誤読されるのを防いでいる。

round 1 は予算上限で判定ゼロのまま落ちたため、同一 baseline(6bc85f3、thread も空のまま)に対して同じ round を撃ち直した。運用コピーは当てていない(skills/* の直接 Read 経路)ので restore も不要。

本 PR 自身の発火判定: issue の constraint どおり merge 時点の条件(変更前の一腕) で判定する。統治面の差分は追加 4 行 / 削除 1 行で追加超過、行腕は発火しない。したがって unmeasured(発火条件外)。

競合: main 追随で gh pr update-branch を実施(非破壊)、CI 再走後 CLEAN。

release type: patch。発火条件の測り方の修正であり、user/system observable な大規模変更ではない。semi_auto の patch は human gate 無しで直接 merge。

次の一手: merge.

@smileygames
smileygames merged commit 8205269 into main Sep 12, 2026
2 checks passed
@smileygames
smileygames deleted the 1934-specmeasurement-firing-condition-counts-lines-so-a-replace-in-place-strip-never-fires branch September 12, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec(measurement): firing condition counts lines, so a replace-in-place strip never fires

1 participant