Skip to content

spec(update): detect a clone that cannot fetch branches on the exists path - #1921

Merged
smileygames merged 4 commits into
mainfrom
1911-clone-refspec-branch-check
Sep 8, 2026
Merged

spec(update): detect a clone that cannot fetch branches on the exists path#1921
smileygames merged 4 commits into
mainfrom
1911-clone-refspec-branch-check

Conversation

@smileygames

@smileygames smileygames commented Sep 8, 2026

Copy link
Copy Markdown
Member

Closes #1911

clone mode の exists 経路に整合性チェックを 1 つ足し、検出のみを行う(issue の 解(a))。自動修復は採らない。

remote.origin.fetch が source 側を refs/heads/ 以下に持つ refspec を 1 本も持たない clone でも tag は解決するため、fetch --tags は成功し、素の git fetch origin もエラーではなく no-op として成功する。何も落ちないまま branch の遅れだけが積み上がる(実測: 374 コミット遅れが約 5 ヶ月、発見は偶発)。

報告先(2026-09-09 改訂後の 解)

LI_PLUS_UPDATE_STATUS には載せない。 同 marker は報告面ではなく adapter startup 手順 step 2 の起動条件であり、reason による分岐を持たない。健全性の欠陥をそこに積むと、検出のみのはずの検査が更新手続きを起動する経路を持つ。

普通の diff-only section にも載せない。 body が変わらないため初回だけ出て、慢性化した瞬間に黙る。

載せ先は section key を持たず diff-only の外に置かれる surface class(Promotion Tally Expiry Surface / Self-Evolution Observation Surface と同じ)。ただし trigger 種は 3 つ目で、既存 2 面の date-driven に対しこの面は state-driven。借りるのは class の性質だけで、日付の語彙は借りない。

state-driven は lifecycle を持たない。 条件が成立しなくなった時点で出なくなるため verdict_stateexpires も除去手順も要らない。この不在が欠落ではないことを本文に明記した —— 明記しないと次に読む人が lifecycle を足しにかかり、条件が消えたのに残るエントリという逆向きの実害が生まれる。

変更点

  • rules/evolution/cold-start-synthesis.md — Clone Branch Fetch Surface 節を新設。Hook Emission Contract の coordination 一覧と no-new-material marker 抑止条件も更新
  • on-session-start hook 3 port — tally surface の隣で emit。.git を持たないディレクトリ(api mode)と git 不在は silent skip
  • Li+update.md / docs/C.-Update.md — clone mode exists 経路に step a(検査)を追加、既存 a-e を b-f へ繰り下げ。報告先は上記 surface を指す
  • docs/6.-Adapter.md / docs/2.-Evolution.md — surface 一覧、marker 抑止条件、diff-only 除外理由(state 駆動という別向きの非対称)
  • tests/test_clone_refspec_branch_check.py — 3 port の behavioural(tag のみ / refspec 皆無 / wildcard / single-branch / clone でない / 修理しないこと)、marker に載っていないこと、2 回目の startup でも黙らないこと(対照として健全 clone では marker が出ることを同じ fixture で確認)、lifecycle 不在の明記

改訂前から対象外へ戻したものadapter/claude/CLAUDE.md / adapter/codex/AGENTS.mdunnecessary 保証列挙。載せ先が marker でなくなったため、branch を引けるかはその保証内容ではない。

impact scope

cold-start の surface 1 面(条件成立時のみ emit、健全な clone では出力ゼロ)+ Li+update.md clone mode exists 経路 + その docs 写し。LI_PLUS_UPDATE_STATUS の挙動は変更なし。

判断の記録

  • 述語は wildcard の literal 一致ではなく「source 側が refs/heads/ 以下の refspec が 1 本以上」。--single-branch の clone は branch を追えており本欠陥に当たらないため、literal 一致では毎セッション誤報する
  • surface の gather を emit 地点に置いた(diff set の外なので body はその時点でしか要らず、そこは非 startup matcher の早期 exit より後 —— git 呼び出しを resume / clear / compact / fork で払わない)
  • ps1 port は -cmatch(bash 2 port の case-sensitive な照合と揃える)

release type = patch(検出のみ。健全な clone に observable な変化なし)。Li+update.mdrules/evolution/cold-start-synthesis.md を含むため self-evolution PR にあたり brake 1 が発火する。

ローカル: python -m unittest discover 235 tests OK(bash / pwsh / node / git すべて実在するホスト)。

🤖 Generated with Claude Code

… path

clone mode の `exists` 経路は `fetch --tags` が branch も進めることを前提に
していたが、`remote.origin.fetch` が `refs/heads/` を 1 本も持たない clone でも
tag だけは解決するため、bootstrap は毎セッション正常完走し branch の遅れだけが
無症状で蓄積していた(実測: 374 コミット遅れが約 5 ヶ月、発見は偶発)。

検出のみを足す。修理はしない(issue の 解(a))。

- `Li+update.md` clone mode `exists` 経路に step a を追加し、既存 a-e を b-f へ繰り下げ
- on-session-start hook の 3 port に verify 軸 4 を実装。
  `remote.origin.fetch` が source 側を `refs/heads/` 以下に持つ refspec を
  1 本も持たない場合、既存の marker reason surface へ
  `clone-refspec-no-branch-mapping` を積む(`sentinel-tag(...)` と同じ経路)。
  clone でないディレクトリ(api mode)と `git` 不在は無言 skip
- `adapter/*/CLAUDE.md` `AGENTS.md` の「`unnecessary` が何を verify 済みと言うか」
  の列挙と、`docs/C.-Update.md` / `docs/6.-Adapter.md` の写しを同一 PR で更新
- `tests/test_clone_refspec_branch_check.py` = 3 port の behavioural(tag のみ /
  refspec 皆無 / wildcard / single-branch / clone でない / 修理しないこと)と
  5 surface の parity

現行 literal は壊れていない。この state は現行の `not exists` 経路からは生まれず、
仕様の穴は「作ること」ではなく「検出しないこと」の側にある。

#1911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@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 #1911 の本文(purpose / premise 1-5 / constraints / ## 解(決定、2026-09-09) / target files 一覧)と、この PR の diff 全9ファイル(Li+update.md, adapter/claude/CLAUDE.md, adapter/claude/hooks/on-session-start.sh, adapter/codex/AGENTS.md, adapter/codex/hooks/on-session-start.ps1, adapter/codex/hooks/on-session-start.sh, docs/6.-Adapter.md, docs/C.-Update.md, tests/test_clone_refspec_branch_check.py, SHA c85c2ea2ee0cdae08f3fca5344ead7f2912e33b4)を突き合わせた。不一致なし:not exists 経路は触れられておらず、報告先は既存の marker reason 経路(sentinel-tag(...) と同じ)のまま新設されておらず、述語も issue が記録した「source 側が refs/heads/ 以下の refspec が 1 本以上」のとおり実装され、target files 一覧の 9 ファイルと diff の変更ファイル集合が一致する。

Axis B — rule violation

diff の追加/変更行を、c85c2ea2ee0cdae08f3fca5344ead7f2912e33b4 時点の rules/**skills/**Li+update.mdadapter/claude/CLAUDE.mdadapter/codex/AGENTS.md に照らして確認した。参照した規範 = rules/operations/operations.md(Docs update must be in same PR / issue reference # 書式)、rules/model/liplus-coding-rule.md(Source Language, Body States Behavior)、rules/evolution/initiator-autonomy.md(Governed surface 分類)、rules/model/subtractive-structural-beauty.md(Core principles)。違反なし:docs 2 ファイルが同一 PR で更新され、PR body は Closes #1911 を含み、rules/skills/ 本体には触れておらず、Li+update.md と両 adapter ファイルの変更は English のまま。

Fixed axis — impression-literal detection

Li+update.md / adapter/claude/CLAUDE.md / adapter/claude/hooks/on-session-start.sh / adapter/codex/AGENTS.md / adapter/codex/hooks/on-session-start.ps1 / adapter/codex/hooks/on-session-start.sh の追加・変更行(66 行)に対して removal test を適用した。

flag 1件:

    # -cmatch, not -match: git ref names are case-sensitive and the two bash
    # ports use a case-sensitive grep. #1804 is the same split, on another value.

adapter/codex/hooks/on-session-start.ps1:240-241

この2行のうち後半「#1804 is the same split, on another value.」を除去しても、-cmatch を使う理由(前半の "git ref names are case-sensitive and the two bash ports use a case-sensitive grep")は既に述べられており、rule の behavior semantic(大文字小文字を区別して refs/heads/ を照合する)は変化しない。同ファイル内の axis 1 の -CaseSensitive コメント(#1804 の split を経緯込みで説明済み)と異なり、この一文は経緯を再説明せず番号だけを添えており、provenance-in-text tell(skills/evolution-impression-literal-detection/SKILL.md Detection signs)に当たる候補として報告する。

brake 1 round 1 の fixed axis(impression-literal detection)の指摘を受理。
`adapter/codex/hooks/on-session-start.ps1` の `-cmatch` コメント末尾
`#1804 is the same split, on another value.` を removal test にかけたところ、
除去しても rule の behavior semantic は変わらない。残る前半が要求
(ref 名は case-sensitive、bash 2 port は case-sensitive な grep)を
それ自体の言葉で述べており、revision stability も変わらない。

#1911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@smileygames

Copy link
Copy Markdown
Member Author

brake 1 round 1 — 裁定(実装 subagent)

対象 commit = 200f092(裁定前は c85c2ea)。各 finding を、その path:line が指す revision の source に literal を突き合わせて判定した。

Axis A — issue requirement:finding なし

不一致なしの報告。裁定対象なし。

Axis B — rule violation:finding なし

違反なしの報告。裁定対象なし。

Fixed axis — impression-literal detection:flag 1 件 → 受理(1/1)

findingadapter/codex/hooks/on-session-start.ps1:240-241
# ports use a case-sensitive grep. #1804 is the same split, on another value.
のうち、後半 #1804 is the same split, on another value.

判定 = 受理。 removal test を c85c2ea の source に対して実行した結果:

  • 除去後に残るのは -cmatch, not -match: git ref names are case-sensitive and the two bash ports use a case-sensitive grep. であり、-cmatch を使うという行為と、それが満たすべき条件(ref 名は case-sensitive、bash 2 port 側は case-sensitive な grep)は残る側が単独で固定している。behavior semantic は変化しない。
  • Negative リストの「Explanatory rationale that prevents a known misinterpretation」に当たるかも見た。当たらない。将来 -cmatch-match へ「単純化」する改変を止めるのは残る前半の要求そのものであり、事案番号ではない。同ファイル 194-198 行の axis 1 コメントが #1804 の経緯を帰結込みで既に運んでおり、この file を読む者はそこで受け取る。revision stability も変化しない。
  • 除去した一文は、rule が何を要求するかではなく、その要求がどこから来たかだけを述べている。skills/evolution-impression-literal-detection/SKILL.md Detection signs の provenance-in-text tell (A) —「A rule sentence narrating how the rule came to be written ... This is the unit — the sentence, carrying a number or not」— に一致する。評価者の指摘(axis 1 のコメントと異なり経緯を再説明せず番号だけを添えている)は source と一致していた。

適用:当該一文を削除(200f092)。前半 2 行は残置。behavior に変更なし、テストに変更なし。

Positive / Negative リストの境界上に乗る flag ではなかったため、spec-gap 観察としての routing は行っていない。

その他の追加行((#1911) を含む axis 4 の見出し行など)は本 round で flag されておらず、findings を超えた掃き出しは行っていない。

…marker

報告先の設計変更(issue #1911 の改訂された 解 / target files)。述語と
「検出のみ、修理はしない」の立場は変わらない。

`LI_PLUS_UPDATE_STATUS` は報告面ではなく adapter startup 手順 step 2 の
起動条件であり、reason による分岐を持たない。健全性の欠陥をそこに積むと、
検出のみのはずの検査が更新手続きを起動する経路を持つ。普通の diff-only
section は逆向きに外す —— body が変わらないため初回だけ出て、慢性化した
瞬間に黙る。

載せ先は section key を持たず diff-only の外に置かれる surface class
(Promotion Tally Expiry Surface / Self-Evolution Observation Surface と同じ)。

- `rules/evolution/cold-start-synthesis.md` — Clone Branch Fetch Surface 節を
  新設。trigger 種は 3 つ目で、既存 2 面の date-driven に対し state-driven。
  借りるのは surface class の性質だけで日付の語彙は借りない。lifecycle を
  持たないこと、その不在が欠落ではないこと(足すと条件消失後も残るエントリを
  生む)を明記。Hook Emission Contract の coordination 一覧と marker 抑止条件も更新
- hook 3 port — 軸 4 を撤去し、tally surface の隣で emit する block を追加。
  no-new-material marker の抑止条件に加算
- `Li+update.md` / `docs/C.-Update.md` — `exists` 経路 step a の報告先を差し替え
- `adapter/claude/CLAUDE.md` / `adapter/codex/AGENTS.md` — `unnecessary` の
  保証列挙を改訂前へ戻す(載せ先が marker でなくなったため対象外)
- `docs/6.-Adapter.md` / `docs/2.-Evolution.md` — surface 一覧、marker 抑止、
  diff-only 除外理由(state 駆動という別向きの非対称)を更新
- tests — surface の behavioural(3 port)に加え、marker に載っていないこと、
  2 回目の startup でも黙らないこと(対照として健全 clone では marker が出ること)、
  lifecycle 不在が本文に書かれていることを pin

#1911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@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 #1911 との不一致

不一致 1件。

issue #1911 本文(## 解(決定、2026-09-09。報告先を 2026-09-09 に改訂)):

git config --get-all remote.origin.fetchrefs/heads/ を source 側に持つ refspec を 1 本でも持つかを見て、持たなければ報告する。

diff 側の述語実装は、configured refspec 全体(複数行を空白結合した文字列、または配列全要素)に対する部分文字列一致であり、source 側と destination 側を区別していない:

  • adapter/claude/hooks/on-session-start.sh:1187*refs/heads/*) ;;(照合対象は 1184 行目で組み立てた CLONE_FETCH_REFSPECS 全体)
  • adapter/codex/hooks/on-session-start.sh:933 — 同上
  • adapter/codex/hooks/on-session-start.ps1:1009if (-not ($cloneFetchRefspecs -cmatch 'refs/heads/')) {

refs/heads/ が refspec の destination 側にのみ現れる構成(例: +refs/tags/v1:refs/heads/mirror)では、source 側に branch を追う refspec が 1 本も無くても「branch を fetch できる」側に誤判定され、報告されない。issue 本文が明示する「source 側」限定の述語をそのままでは満たしていない。追加されたテスト(tests/test_clone_refspec_branch_check.pyTAG_ONLY / WILDCARD / SINGLE_BRANCH / 複合 fixture)はいずれも destination 側にだけ refs/heads/ が現れる構成を持たないため、この差分はテストでは検出されない。

それ以外は issue 本文と一致を確認した:Li+update.md の exists 経路への step a 追加と既存 a-e の b-f への繰り下げ、報告先を LI_PLUS_UPDATE_STATUS からも通常の diff-only section からも外したこと、3 ポート(adapter/claude/hooks/on-session-start.sh / adapter/codex/hooks/on-session-start.sh / adapter/codex/hooks/on-session-start.ps1)での emit 追加、state-driven / lifecycle 不在の本文明記、adapter/claude/CLAUDE.md / adapter/codex/AGENTS.md が target files から外れたこと(実際に diff は触れていない)、docs/2.-Evolution.md / docs/6.-Adapter.md / docs/C.-Update.md の同期(docs/6.-Adapter.md に「改訂前の記述」= 旧・unnecessary 保証列挙側の refspec 言及が残っていないことも確認した)、tests/ の behavioural 網羅。9 changed files 全件を読んだ。

Axis B — rule violation

違反 3件(同一パターン、3 ポートに重複)。

  • adapter/claude/hooks/on-session-start.sh:1187
  • adapter/codex/hooks/on-session-start.sh:933
  • adapter/codex/hooks/on-session-start.ps1:1009

拘束する rule literal(この diff 自身が rules/evolution/cold-start-synthesis.md に新設したもの):

rules/evolution/cold-start-synthesis.md:103 — the workspace holds a Li+ clone, and remote.origin.fetch carries no refspec whose source side is under refs/heads/ -> surface as "clone cannot fetch branches"
rules/evolution/cold-start-synthesis.md:105 — The predicate is the source side of a refspec, not the wildcard literal.

上記 3 行は refspec 全体に対する部分文字列一致で判定しており、「source 側」限定を実装していない。3 ポートとも同一の近似のため、port 間 parity の欠陥ではなく、rule literal 自身に対する 3 箇所の不一致。

このほか、diff が追加・変更した行を rules/evolution/cold-start-synthesis.md(Clone Branch Fetch Surface 節および Hook Emission Contract / no-new-material marker の周辺節)、rules/evolution/initiator-autonomy.md Governed surface、rules/operations/operations.md(Docs update must be in same PR、commit body 言語規定)、rules/model/liplus-coding-rule.md Source Language、rules/model/subtractive-structural-beauty.md、および Li+update.md 自体の該当箇所と突き合わせたが、他に許容されない行は見つからなかった。

Fixed axis — impression-literal detection

フラグ 3件(同一文型、3 ポートに重複)。

  • "(issue #1911)"adapter/claude/hooks/on-session-start.sh:1160
  • "(issue #1911)"adapter/codex/hooks/on-session-start.sh:906
  • "(#1911)"adapter/codex/hooks/on-session-start.ps1:999

いずれも Implements rules/evolution/cold-start-synthesis.md "Clone Branch Fetch Surface" (issue #1911). という文の括弧書き issue 番号部分。除去してもコメントが指す canonical contract へのパス参照(rules/evolution/cold-start-synthesis.md "Clone Branch Fetch Surface")は残り、hook の実行時挙動(behavior semantic)は変わらない。

参考: 同ファイル内の変更されていない既存コメントに同型の issue 番号引用が複数件ある(adapter/claude/hooks/on-session-start.sh:239,289,440,512,974,1055 等)。同一パターンの先例が多数あることは、除去テストの結果そのものを変えるものではないため、参考情報として付記するのみで判定には用いていない。

brake 1 round 1(再設計後の baseline)の指摘を受理。Axis A 1 件 / Axis B 3 件
(同一実体、3 port)、fixed axis 3 件。

述語が refspec 全体に対する部分文字列一致になっており、`[+]<src>:<dst>` の
src 側限定を実装していなかった。`+refs/tags/v1:refs/heads/mirror` のように
dst 側にしか `refs/heads/` が現れない構成は branch を 1 本も引かないのに
健全と読まれる。本 PR 自身が新設した contract literal(source side)に対する
不一致であり、3 port とも同じ近似のため port 間 parity の問題ではない。

- hook 3 port — refspec を 1 本ずつ読み、先頭 `+` を落として `:` の手前を
  source 側とし、`refs/heads/` 以下かを判定する。`^<pattern>` は exclusion で
  mapping を成立させないため除外。ps1 は Ordinal 比較(ref 名は case-sensitive)
- `rules/evolution/cold-start-synthesis.md` / `docs/6.-Adapter.md` — src 側の
  読み方と exclusion の扱いを本文に明記(実装と literal を一致させる)
- tests — dst 側にのみ `refs/heads/` を持つ fixture と exclusion 単独の fixture を
  追加し、いずれも報告されることを pin。複合 fixture もこの 2 本を含める形に更新
- hook 3 port のコメントから括弧書きの issue 番号を除去(fixed axis 3 件)。
  除去しても canonical contract へのパス参照が残り behavior semantic は変わらない

#1911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@smileygames

Copy link
Copy Markdown
Member Author

brake 1 round 1(再設計後 baseline)— 裁定(実装 subagent)

対象 commit = 7ac43c9(裁定前は 51103bb)。各 finding を、その path:line が指す revision の source に literal を突き合わせて判定した。7 件すべて受理(7/7)。

Axis A — issue requirement:不一致 1 件 → 受理

finding:述語が configured refspec 全体に対する部分文字列一致であり、issue 本文が明示する「source 側」限定になっていない(adapter/claude/hooks/on-session-start.sh:1187 / adapter/codex/hooks/on-session-start.sh:933 / adapter/codex/hooks/on-session-start.ps1:1009)。

判定 = 受理。 source を確認したところ指摘のとおりだった。51103bb の 3 port はいずれも CLONE_FETCH_REFSPECS(全 refspec を空白結合した 1 本の文字列)または配列全体に対して refs/heads/ を照合しており、[+]<src>:<dst> の src / dst を区別していない。評価者の反例 +refs/tags/v1:refs/heads/mirror は dst 側にしか refs/heads/ を持たず、remote の branch を 1 本も引かないが、旧実装では健全側に落ちる。issue 本文(## 解 の「refs/heads/ を source 側に持つ refspec を 1 本でも持つか」)を満たしていない。

追加テストがこの差分を検出しないという指摘も、そのとおりだった。TAG_ONLY / WILDCARD / SINGLE_BRANCH / 複合のいずれも、dst 側にのみ refs/heads/ が現れる構成を持っていない。

Axis B — rule violation:3 件(同一実体、3 port)→ 受理

finding:本 PR 自身が新設した rules/evolution/cold-start-synthesis.md の literal(the source side of a refspec / The predicate is the source side of a refspec, not the wildcard literal.)に対して、3 port の実装が不一致。

判定 = 受理。 Axis A と同一の実体であり、拘束する literal がこの diff 自身の新設分であるという読みも source と一致する。3 port が同じ近似であるため port 間 parity の欠陥ではなく、rule literal に対する 3 箇所の不一致という切り分けもそのとおり。

適用(Axis A / B)

7ac43c9

  • 3 port とも refspec を 1 本ずつ読み、先頭 + を落として : の手前を source 側とし、refs/heads/ 以下かで判定するよう変更。ps1 は [System.StringComparison]::Ordinal(ref 名は case-sensitive、bash 2 port と揃える)
  • 指摘の射程を 1 つだけ広げた^<pattern>(exclusion refspec)。^refs/heads/main は「source 側が refs/heads/ 以下」を字面では満たすが mapping を成立させないため、同じクラスの誤判定になる。3 port で exclusion を除外し、contract 本文の側にもその読み方を書いた(実装が literal を追い越さないように)。rules/evolution/cold-start-synthesis.mddocs/6.-Adapter.md に、src 側の読み方と exclusion の扱いを追記
  • テスト 2 本追加:dst 側にのみ refs/heads/ を持つ fixture(+refs/tags/v1:refs/heads/mirror)、exclusion 単独の fixture(^refs/heads/main)。いずれも 3 port で報告されることを pin。複合 fixture もこの 2 本を含む形に更新。旧実装に対しては両方とも落ちる

Fixed axis — impression-literal detection:3 件(同一文型、3 port)→ 受理

findingImplements rules/evolution/cold-start-synthesis.md "Clone Branch Fetch Surface" (issue #1911). の括弧書き issue 番号(adapter/claude/hooks/on-session-start.sh:1160 / adapter/codex/hooks/on-session-start.sh:906 / adapter/codex/hooks/on-session-start.ps1:999)。

判定 = 受理。 removal test を 51103bb の source に対して実行した:

  • 除去後も Implements rules/evolution/cold-start-synthesis.md "Clone Branch Fetch Surface". が残り、canonical contract へのパス参照は失われない。hook の behavior semantic は変化しない
  • Negative リストの「Quotes with explicit referent (literal source citation with path)」で保護されるのはパス参照の側であり、番号はそれと分離できる。「Explanatory rationale that prevents a known misinterpretation」にも当たらない —— 設計判断(diff-only の外、marker に載せない、state-driven)はコメント本文がそれ自体の言葉で述べており、番号に依存していない
  • Detection signs の provenance-in-text tell (A) は「unit は文であり、番号を持つか否かではない」と言う。ここでは文が contract を名指す働きを持ち、番号はその末尾に付いた別要素なので、番号を落とした文が単独で成立する

適用:3 port の当該箇所から括弧書きを除去(7ac43c9)。

評価者が付記した「同ファイル内の未変更コメントに同型の先例が多数ある」という参考情報は、判定に用いていない(skill が count を判定材料にしないと定める)。同時に、それらは本 round の findings ではないため掃き出しも行っていない。

Positive / Negative リストの境界上に乗る flag は無かったため、spec-gap 観察としての routing は行っていない。

ローカル: python -m unittest discover 237 tests OK。

@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 #1911 との不一致

不一致なし。 SHA 7ac43c9853e7c406f4943beaf2b6f727c3070445 の diff 全9ファイル(Li+update.md, rules/evolution/cold-start-synthesis.md, adapter/claude/hooks/on-session-start.sh, adapter/codex/hooks/on-session-start.sh, adapter/codex/hooks/on-session-start.ps1, docs/2.-Evolution.md, docs/6.-Adapter.md, docs/C.-Update.md, tests/test_clone_refspec_branch_check.py)を、issue #1911 本文の purpose・premise (1)-(5)・constraints・## 解(決定、2026-09-09。報告先を 2026-09-09 に改訂)(改訂後の報告先・no-lifecycle 要求含む)・## target files(改訂、2026-09-09)(除外された adapter/claude/CLAUDE.md / adapter/codex/AGENTS.md の扱い含む)と突き合わせた。述語(source 側に refs/heads/ を持つ refspec が 1 本以上)、報告先(LI_PLUS_UPDATE_STATUS にも通常の diff-only section にも載せない・section key を持たない surface class)、state-driven / lifecycle 不在の明記、exists 経路のみが対象で not exists の 2 コマンド literal は未変更、adapter/claude/CLAUDE.md / adapter/codex/AGENTS.md が対象から外れ diff も触れていないこと、docs 3 ファイルの同期を確認した。round 1 で受理・修理済みの src/dst 区別(7ac43c9 で修理済み)もこの版で維持されている。

Axis B — rule violation

違反なし。 diff の追加/変更行を、7ac43c9853e7c406f4943beaf2b6f727c3070445 時点の以下に照らして確認した:rules/evolution/cold-start-synthesis.md(本 diff 自身が新設した Clone Branch Fetch Surface 節の predicate literal、および Hook Emission Contract / no-new-material marker 周辺の既存節との整合)、rules/evolution/initiator-autonomy.md Governed surface、rules/operations/operations.md(Docs update must be in same PR、issue reference # 書式、commit/PR body 言語規定)、rules/model/liplus-coding-rule.md(Source Language、Source File Format の H2 kebab-case タグ)、rules/model/subtractive-structural-beauty.md Spec write applies (B)(lifecycle を持たせない設計判断との整合)、Li+update.md 自身の exists 経路 literal、adapter/claude/CLAUDE.md / adapter/codex/AGENTS.mdLI_PLUS_UPDATE_STATUS 分岐 literal(reason 配列 UPDATE_REASONS に新規変数 CLONE_REFSPEC_EMITTED が合流していないことをソースで確認済み、marker への横流れなし)。3 port(claude bash / codex bash / codex ps1)の実装は同一ロジックで揃っており、ps1 の -cmatch / Ordinal 比較も bash 2 port の case-sensitive な照合と揃っている。

Fixed axis — impression-literal detection

フラグなし。 スコープ対象 5 ファイル(Li+update.md, rules/evolution/cold-start-synthesis.md, adapter/claude/hooks/on-session-start.sh, adapter/codex/hooks/on-session-start.sh, adapter/codex/hooks/on-session-start.ps1)の追加/変更行(git diff --numstat main...7ac43c9 = 追加 232 行・削除/変更 19 行)に removal test を適用した。round 1 で受理・除去済みの (issue #1911) 括弧書き(3 port)は現版で確認したところ既に除去されており、再帰していない。新規に追加された行のうち、provenance-in-text tell(issue/PR 番号や経緯の再説明)・push surplus tell("just in case" 等)に該当する語彙は grep でも見つからなかった。

@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.

self-review(parent、Claude Lay

受け入れ基準

issue #1911 の purpose は「bootstrap が clone の branch fetch 能力を一度も確かめない」ことの解消。7ac43c9 の diff は Li+update.md clone mode exists 経路に検査を置き、3 port が実際に emit する形まで通っている。constraints を個別に確認した。

  • 現行 literal を「壊れている」と書かない: not exists 経路の 2 コマンド literal は未変更
  • exists 経路のみが対象: そのとおり
  • 検出のみ、修理しない: 3 port とも config を書き換えない。テストがそれを pin している
  • 報告先は LI_PLUS_UPDATE_STATUS ではない: 新規変数が UPDATE_REASONS に合流していないことを round 2 の Axis B が source で確認済み。parent 側でも diff を読んで同じ結論
  • state-driven / lifecycle 不在の明記: rules/evolution/cold-start-synthesis.md の新節に、trigger 種が 3 つ目であること、verdict_state / expires を持たないこと、その不在が設計であることが入っている

scope 逸脱

無し。ただし裁定側が finding の射程を 1 箇所広げており、それを自己申告している(exclusion refspec ^<pattern> の除外)。parent 判断 = 妥当。 ^refs/heads/main は「source 側が refs/heads/ 以下」を字面では満たしながら mapping を成立させないので、finding が名指した false-healthy と同じクラスに入る。加えて、実装だけを広げず contract 本文の側にも書いている点を評価する —— rules/model/liplus-coding-rule.md Body States Behavior が本文に behavior を置くことを求めており、実装が literal を追い越す形を作っていない。

brake 1

この PR は brake を 2 度走らせている。1 度目は差し替え前の設計に対するもので、往復の計数を引き継いでいない。

  • 改訂前(報告先 = LI_PLUS_UPDATE_STATUS の reason): evaluator round 1 / round trip 1。finding 1 件(固定軸、ps1 の provenance 一文)、採用
  • 改訂: parent が issue 本文の決定節を差し替え、通常の委譲として実装変更を投げた(brake の relay ではない)
  • 改訂後(報告先 = cold-start の state-driven surface): evaluator rounds 2 / round trips 1 / N=1 各 round。finding 7 件(Axis A 1 / Axis B 3 / 固定軸 3)、全件採用、却下ゼロ。round 2 は 3 軸すべて指摘なしで clean exit

計数を 1 から数え直したのは規定の適用ではなく parent の判断である。 cap の literal(at most three evaluator rounds and three author responses)は baseline 変更時の扱いを持たず、step 7 の Re-run は「verdict を返さなかった round の再試行」を the baseline it ran against — the PR commit SHA — is unchanged の条件で扱う。今回は verdict が返っていて baseline が動く形で、どちらの枝にも当たらない。判断の理由は、round 1 が評価したのが差し替え前の設計であり、Axis A が突き合わせた issue 本文も差し替わったこと。同じ instrument が同じものを測っていない以上、往復を引き継ぐと cap が測っていないものを数える。

却下はゼロなので、standing rejection の再裁定は無い。

手順の逸脱

無し。

  • step 2 の operational copy は改訂後の 2 round とも適用した。rules/evolution/cold-start-synthesis.mdrules/**/*.md であり、評価者の型による例外を持たない mandatory 側。改訂前の round では対象が adapter/claude/CLAUDE.md で、step 2 の名指し 2 bullet には載らないが preamble の条件(注入文脈として届くか)で適用が要る側だった。どちらも適用し、各 round の post 後・resume 前に step 5 で restore、sha256 一致を確認(607a2d35... / a9f7b067...
  • **適用の仕方に 1 つ判断がある。**ワークスペースの .claude/build-2026-09-07.4 の中身で main より 1 行古く、PR の diff は main に対するものなので base が食い違う。**diff を当てるのではなく、PR の SHA におけるファイル本体をそのまま書いた。**結果、適用中の手元は「main + draft」になる。部分適用は draft でも main でもない第三の状態を作るため、こちらを採った
  • step 3 の material は PR URL / SHA / green CI run URL のみ。親クローン内のパスは渡していない
  • step 4 は finding のある round のみ発火。round 2 は clean のため author を resume せず step 8 で exit

rule effect measurement

unmeasured (outside the firing condition)。governed body(rules/** / skills/** / adapter/**)は rules/evolution/cold-start-synthesis.md が +31/-2、hook 3 port が計 +185/-12 で、削除が追加を上回っていない。

parent 側で記録しておくもの

テストが在ることと、その欠陥を捕まえられることは別という形が実物で出た。round 1 の Axis A / B が指した述語の誤り(refspec を src:dst に割らない)に対して、**同じ PR が追加した fixture 3 本(TAG_ONLY / WILDCARD / SINGLE_BRANCH)はいずれも refs/heads/ を destination 側に置いておらず、この欠陥を検出できなかった。**評価者がそこまで報告し、裁定側も認めている。述語を書いた側が fixture も書いたため、**盲点が両方に写っている。**修理では dst 側のみ・exclusion 単独の 2 本が追加され、どちらも旧実装に対して落ちることが確認されている。

これは #1920tests/** の規範的散文がどの軸の射程にも入らない)とは別の軸 —— あちらは散文が読まれない話、こちらはテストの網が実装と同じ形に歪む話。1 件なので起票していない。post-merge observation に載せる。

release type と mode gate

patch理由は observable でないことではなく、large でないこと。 壊れた clone のあるワークスペースでは起動時に 1 行増えるので、これは system observable な変化である。rules/operations/release-version-rule.mdminorlarge refactor or large structural change that is user/system observable であり 両方を要する。増分は検出 1 本と surface 1 行ぶんで large に当たらないため、everything else として patch に落ちる。

execution_mode = semi_auto かつ patch のため人のレビュー gate は立たない(rules/operations/execution-mode.md Mode matrix)。self-review pass をもって direct merge に進む。

@smileygames
smileygames merged commit b0acf84 into main Sep 8, 2026
2 checks passed
@smileygames
smileygames deleted the 1911-clone-refspec-branch-check branch September 8, 2026 18:01
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(update): clone mode exists path never checks that the clone can fetch branches

1 participant