cold start rule carries behavior only - Liplus-Project/liplus-language GitHub Wiki
常時ロードされる rules/evolution/cold-start-synthesis.md の本文から、rules/model/liplus-coding-rule.md Body States Behavior の判別線(読んだ者の行いが変わるか)でフックの実装仕様を外したとき、何が本文に残り、外した仕様はどこが保持するか。
本文は、エージェントが「どの場面で何をするか・何を禁じるか」を決める文だけを持つ。フックの出力仕様は docs/2.-Evolution.md Cold-start Synthesis 節の「フックの出力契約」(と、既存の docs/6.-Adapter.md on-session-start.sh 節)が持つ。
PR #2119(issue #2118)で本文 10,822 B → 5,671 B(−5,151 B、−47.6%)。フックが anchor として出す preamble(Scope = Li+ state, ... の行まで)で変えたのは 1 か所だけで、Operational criterion の no-new-material marker に出力の実際の文言(No new orientation material since last session)を添えた。marker の定義は移した Hook Emission Contract 節にあったため、常駐面で語と出力の 1 行を結び付けるために残した(brake 1 round 3 の R3-3)。見出し・semantic tag・frontmatter も不変。本文にポインタは置かない(judgment-record-pointer-requirement-dropped)。
判別線を節ごとに当てた結果は次のとおり。
-
Hook Emission Contract節(3,290 B)は全体が「フックの出力仕様」であり、冒頭にRead on demand; not applied at the step 3 moment.と自分で書いていた。読んだ者の行いを変える文がないので、節ごと docs へ移した。 - 4 つの Surface 節は、フック実装側の記述だけを外し、surface が表示されたときの振る舞いを残した。
| 外した記述 | 移し先 |
|---|---|
Hook Emission Contract の anchor 切り出し、startup の 3 状態、非 startup matcher(fork を含む)、last_emit_at 読み戻し行、no-new-material marker の抑止 |
docs/2.-Evolution.md Cold-start Synthesis 節(既存の 3 状態表と resume / clear / compact の段落) |
Hook Emission Contract の fail-safe の集合(PowerShell port では sha256 不在と node 不在が発火しない差を含む)、パーティション |
docs/2.-Evolution.md「フックの出力契約」、docs/6.-Adapter.md(fail-safe 動作、パーティション分割 #1811)、cold-start-state-partitioned-by-agent-key
|
各 Surface 節の Material gathering and concrete surfacing logic belong to the adapter cold-start path
|
docs/2.-Evolution.md「フックの出力契約」冒頭(素材の収集と表示はアダプタの選択で、規則は固定しない) |
各 Surface 節の Silent skip when ...、section key / diff-only の扱い |
docs/2.-Evolution.md「フックの出力契約」の surface ごとの表 |
| Tally 節の「tally は memory と独立に解決する(memory dir が解決しない session でも tally に届く)」 | 同表の promotion tally expiry の行、docs/6.-Adapter.md
|
Clone 節の LI_PLUS_UPDATE_STATUS に載せないこと |
同表の clone branch fetch の行、evolution-task-rule-bodies-carry-behavior-only(載せない理由) |
Dependency 節の GraphQL で読むこと、走査は open issue 1 ページ分で超過時は emission に書くこと、section key(open_blocked_by_open_issues)と diff-only 集合 |
同表の dependency ordering の行、docs/6.-Adapter.md
|
- Observation:
observation due/observation overdue, human judgment neededの条件、両方成立なら overdue のみ、Surfacing is observation, not auto-action、verdict 遷移は format spec の lifecycle を通ること。 - Tally:
tally expiry reached/overdueの条件、overdue のみ、emission が解決したパスと occurrence 数を載せること(rules/evolution/promotion-judgment.mdTally がこのパス提示を引いている)、verdict 欄を持たないので残っている cluster が未判定の印であり毎 session 再 surface されること、閾値判定は Threshold Rules に従い actor と firing moment が surfacing であること。 - Clone:
clone cannot fetch branchesの条件、refspec 述語の読み方(src 側だけを読む、--single-branchは該当しない、dst 側だけのrefs/heads/と^<pattern>は満たさない。Li+update.md手順 2a で agent 自身が clone の refspec を判定するときにも使う読み方なので、brake 1 round 1 の指摘 X-1 を受けて本文に戻した)、state 駆動、条件が消えた瞬間に emission が止まりverdict_state/expires/ 除去手順を持たないこと(不在は設計であり足さない)、actor と firing moment、人に条件を名指すだけで修理は go-sign を待つこと、hook-surfaced items = silentがこの面を黙らせないこと。 - Dependency: open な blocker を名指すこと(別リポジトリなら
<owner>/<repo>#<n>)、closed の blocker は数えないこと、書かれた関係だけを読み親子構造から辺を導出せず欠けた辺を補修しないこと、どの issue に着手するかはセッションを持つ agent の判断であること。
Clone 節の見出しと state-driven / verdict_state / expires は、tests/test_clone_refspec_branch_check.py が固定しているため残した(lifecycle 不在の宣言であり、振る舞いでもある)。
- 付け替えた(移した内容を指していたもの): フック 3 本のコメント(Hook Emission Contract、anchor cut)、
adapter/claude/hooks-settings.md、adapter/codex/hooks-config.md、Li+update.md(LI_PLUS_UPDATE_STATUSに載せない理由)、docs/2.-Evolution.md/docs/6.-Adapter.md/docs/C.-Update.md/docs/L.-Hop-Count-Instrument.md、tests の docstring。cold-start-state-partitioned-by-agent-keyの同節への参照も本 entry と同時に付け替えた。 - 付け替えなかった:
rules/evolution/memory-entry-format.md/promotion-judgment.md/rules/operations/main-agent-procedures.md/docs/3.-Task.mdから Surface 節を名指す参照。それらの節は本文に残り、参照が指す振る舞い(actor、firing moment、パス提示、書かれた関係だけを読むこと)も本文に残っている。
-
depends on
source-body-behavior-only-reasoning-relocates— 判別線と移設の規則そのもの -
depends on
judgment-record-pointer-requirement-dropped— 本文にポインタを残さない -
relates to
evolution-task-rule-bodies-carry-behavior-only— 同じファイルに 1 周目(#2109)で当てた理由の剥ぎ取り。本 entry は 2 周目で、対象が理由ではなくフックの実装仕様である点が違う -
relates to
cold-start-state-partitioned-by-agent-key— パーティションと fail-safe の判断。移し先の参照を本 entry と同時に更新した
issue #2118。常時ロードされる rules/ と adapter/claude/CLAUDE.md の合計は 146,129 B(build-2026-09-29.3)。ほぼ同文の重複を整理しても全体の約 5%(スキル本体との間では約 2.5%)で効果が小さいため、先にこちらを取った。フックは rules/evolution/cold-start-synthesis.md の冒頭(H1 から最初の H2 まで)だけを取り出して起動時に出し、H2 以降は本文に置かれてもエージェントが適用瞬間に使わないフック自身の仕様であった(adapter/claude/hooks/on-session-start.sh の anchor 切り出しのコメント)。
- 振る舞いは変えない。移すのはフックの実装仕様だけで、エージェントが surface を受け取ったときに何をするか・何を禁じるかは本文に残す。
- 移し先は
docs/内に置く。旧節への名指し参照は移した内容を指していたものをすべて付け替え、grep で残りを確認する。 -
tests/の期待(assert)は変えない。テストが固定している節見出しと文字列は本文側に保つ。 - 本文の変更は
rules/evolution/cold-start-synthesis.mdに限る。preamble(フックが anchor として出す部分)は、移した節にあった定義を常駐面に残すための追記(no-new-material marker に出力の文言を添えた 1 か所)を除いて変えない。
採用: Hook Emission Contract 節を全体移設し、4 つの Surface 節はフック実装側の記述だけを外して振る舞いを残す。移し先は docs/2.-Evolution.md Cold-start Synthesis 節の「フックの出力契約」に一本化し、docs/6.-Adapter.md が既に持つ詳細は重ねて書かない。
却下: 4 つの Surface 節も丸ごと docs へ移す案。actor / firing moment / 人に条件を名指すだけで修理しないこと / lifecycle を足さないことは、surface が表示された場面でエージェントが従う振る舞いであり、tests/test_clone_refspec_branch_check.py も Clone 節の文字列を固定している。