Skip to content

Skill body sections declare firing moments their description cannot route to #1634

Description

@liplus-lin-lay

目的

skill の description は Li+ 唯一のルーティング信号である(アダプター側にトリガ表を持たない設計 — adapter/claude/CLAUDE.mddocs/K.-Source-File-Format.md)。body に節を足したときに description を元のスコープのまま置いた結果、その節が名指しする「まさにその瞬間」に誰もその skill を開けない箇所が溜まっている。

scheduled evolution-full-run (2026-08-02) の read-only 監査で 44 skill を全文読解して検出。

確認済みの事実

共通形状はひとつ: body に固有の発火条件を散文で抱えた節が追加され、ルーティングする唯一の面である description は前のスコープのまま残された。

A. 発火条件の被覆漏れ(到達不能な節)

以下は載っている節の発火モーメントが description のどの節にも無く、実際には別の skill が開かれる。

  1. operations-on-sub-issue — body :41 の scope-exceed dialogue confirm は :43 で「At sub-issue creation OR mid-implementation ... fire a dialogue confirm before the commit」、:59 で「Post-implementation (PR review time) is too late and is rejected as a firing moment — the gate must fire pre-commit」と自分で宣言する。しかし description の 3 条件はすべて sub-issue の作成・分類・リンクの瞬間で、pre-commit の経路が無い。実装中に commit しようとするエージェントが開くのは operations-on-commitrules/task/task.md:38(always-on)がこの skill をゲートの権威として名指ししているため、常時 context にある規則が、適用の瞬間に開けない skill を指している。
  2. operations-on-issue-maturity — body :32 の memo-mode rapid intake は :34 で「human が『黙って』/『quick memo』と示した時」を自分の発火条件として持つ。だがこれは issue 作成の瞬間であり、routing 先は operations-on-issue-format(description が「canonical convergence fields (purpose, premise, constraints, target files)」を約束)。その body :18-24 に rapid path は無い。仕様がフィールド集合を省けと言っている瞬間に、フィールド集合を必須とする側だけが開かれる。
  3. operations-on-release — body :109-112 の適用モーメント 3 つのうち 2 つ(cold-start synthesis での「Latest 遅れ / flip 保留」を unique insight として出すな / 人間の明示的な問い以外での release state 言及)が description の 4 条件のどれにも当たらない。セッション開始時に hook が release tag を surface して synthesis を組む瞬間、リリース作成でも branch 削除でも force push でも完了報告でもないためこの節は絶対に読まれない。この節が抑止するために書かれた当のドリフトが、routing 不能な瞬間に起きる。
  4. model-source-check — body 11 節のうち :73 External-capability spec-write order:105 System-injected output litmus が Provides にも発火条件にも無い。後者の litmus(:107 「The injected value is the claim to verify, not the verification」)は on-session-start.sh が毎起動でマーカーを注入する以上セッション中の最高頻度ケース。
  5. task-subagent-delegation — description の第3発火条件「bounded read-only investigation ... is about to be delegated」に対応する body 節が無い(body は Rules / Responsibilities / Autonomy / Adjacent firing moments、いずれも issue・branch・commit・PR を前提とする)。実際に読み取り専用監査の委譲に効く内容(再帰 spawn 禁止)は skills/task-subagent-prompt/SKILL.md:49 にあり、同じ発火条件が両方の description に書かれている
  6. operations-on-docs-ownership — body :33 は「編集に、属する集合を grep して全メンバーを列挙せよ」と pre-edit 動作を規定するが、description の発火モーメントは「about to be committed」= post-edit のみ。pre-grep 側が到達不能で、post-grep 側しか残らない。
  7. evolution-self-eval — description は「self-evaluation entry is about to be recorded」= 記録すると既に決めた後に発火する。body :32-34 の trigger は「Record when fact is observed」= 手続きを飛ばした瞬間・人間の訂正が入った瞬間であり、記録するかどうかを決める側。決める瞬間には何も routing しない。

B. Provides 句の不正確

  1. evolution-parallel-agent-eval — description が既定として safer-side OR aggregation を名指しするが、body :55 の aggregation rule は「Choose based on the asymmetry of the judgment」と per-judgment 選択にしており、OR は :58 の delete/keep 二択に限定、adopt/reject は :59 で AND、中間は :60 で three-value。かつ Procedure step 6(:87)は three-value 分岐を実行する。brake 1 は adopt/reject 判断であり、description だけを読むと body が別物を割り当てている既定を持ち込む。伝播済み: skills/evolution-impression-literal-detection/SKILL.md:30 が「brake 1's default safer-side OR」を基準に自分の閾値を較正している(Record the asymmetric brake 1 aggregation threshold as a Decision Structure entry #1616 とは別軸)。
  2. evolution-loop — Provides が「the loop entry and exit contract」を約束するが、body 30 行に entry 条件も exit 条件も無い。逆に実在する Execution mode / Stage responsibility が Provides に無い。実際の entry/exit 権限は rules/evolution/initiator-autonomy.mdskills/evolution-full-run/SKILL.md:16 にあり、この description はどちらも指していない。
  3. operations-on-merge / operations-on-pr-review — 両者の Provides が pre-merge の成果物で止まり、body の post-merge 義務(operations-on-merge:33 の L1 変更後 5 分観測 / operations-on-pr-review:82-86 の deferred item を同一セッションで実行)を名乗っていない。rules/operations/operations.md:120 はこの skill を「merge の瞬間に確実に発火する invocation anchor」として名指ししている。merge と post-merge が別セッションになる経路(trigger モードで auto-merge が人間承認後に発火し、subagent のセッションは先に終わる — operations-on-pr-review:33-34 が自分で記述)では、どの description も 5 分観測を名乗っていない。
  4. model-trigger-check-gate-actions — description 9 条件に対し body :24 の trigger moments は 10。未ミラー 2 件のうち :30「Before choosing Character / tone / closing」は、evolution-self-eval:68 が「Primary axis = Character drift」と置く当の瞬間。

C. description の形式逸脱

  1. model-agentic-search — 44 本中唯一、description が Provides 句を持たず、末尾が行動規則の断片(「Internal knowledge is the comparison baseline only under the (a)/(b) triggers, never the answer source.」)で終わる。862 文字(最長)をすべて発火条件に費やしており、body の二段 retrieval プロトコルと 9/12 クエリ予算がルーティング面から不可視。発火条件自体は精密なので skill は開くが、複数が同時に一致した瞬間に比較できない。Split model-agentic-search by firing condition (L1, brake 2 required) #1599(発火条件による分割)とは別軸で、分割しても残る。

D. 発火条件の重複

  1. task-pr-review-judgmentoperations-on-pr-review — CI green の瞬間に両方の description が一致し、どちらを開く資格があるか description から判別できない。判別軸(main か subagent か)は body 側(task-pr-review-judgment:13)にあり、しかもそれは主エージェントが読むなと言われている側の body。軸が description で表現可能なことは operations-on-pr-review の第2節が subagent を名指ししていることで証明されている。両 body は同一内容の深さも違う(前者は execution-mode.md へ委譲、後者は per-PR exception を inline)ため、どちらが開いたかで知識が変わる。

clean だった軸

  • frontmatter 整合性は 44/44 で完全にクリーン。3 キー同順(name / description / layer)、name はディレクトリ名と一致、layer は 6 値のいずれか、接頭辞→layer の対応(model-*→L1 等)に例外なし。description の 1024 文字上限超過ゼロ
  • 発火条件の重複はほぼクリーン。候補 13 ペアを追跡し、12 ペアは境界を明示していた(model-accepted-tradeoff:45 / trigger-check-gate-actions:65-66 / release↔release-state / evolution-full-run:18 / parallel-agent-eval:11)。残る 1 件が上記 13
  • description の形式もほぼクリーン。Invoke-when / Provides の house 形が全体で保たれ、Defines / Enforces / Handles / Applies / Retrieves への動詞置換は一貫した許容変異。topic ラベルとして書かれた description はゼロ

制約

  • L1 Model Layer には触れない。 skills/evolution-l1-update-gating の long-horizon observation 閾値は AI 単独起動では hard requirement。上記のうち model-* prefix の skill(4 / 11 / 12)は L1 に該当するため、本 issue の実装対象から外すか、閾値が満たされるまで待つ
  • description は毎起動で全 44 本が context に載る。条件を足すことは常時コストの増加であり、足す前に「この節は本当に load-bearing か」を先に問うObservation: skill listing exceeds context budget; 9 discipline skills never dispatched in 52 startups #1542 が listing の context 予算超過を既に観測している)。到達不能な節を description 側で拾うのではなく body 側を削る解も候補
  • 8 は description と body のどちらが正かを先に決める。skills/evolution-impression-literal-detection:30 の較正が既定に依存しているため、決めた側に合わせて両方を直す
  • 13 は description に actor 軸(main / subagent)を書き足すのが最小。body 側の「operations skill を読むな」規定は触らない

完了条件

  • body の各節が名指しする発火モーメントに、その skill を開く description 条件が存在する(または、その節が body から消えている)
  • Provides 句が body の実在節と一致している
  • 8 の aggregation 既定が 1 つに定まり、参照側の較正がそれに一致
  • 13 の判別軸が description から読める

関連

決定(2026-08-03)

スコープ

解決方針の優先順

各項目に対し、上から順に適用可能な手段を採る。description への条件追加は最終手段。#1542 の観測(listing が context 予算を超過)と本 issue が逆を向かないための構造。

  1. body 節を削る — その節が load-bearing でない場合
  2. 発火モーメントを所有する always-on ルール / 別 skill の body へ節を移す — listing コストの増加ゼロ
  3. description に条件を追加する — 1 / 2 が不可能な場合のみ。選んだ理由を PR 本文に記録する

Provides 句の不正確(9 / 10)と重複条件の削除(5)は listing コストの減少側であり、この優先順の対象外。

項目別の確定事項

  • 2operations-on-issue-maturity:32-34 の memo-mode rapid intake を operations-on-issue-format の body へ移す(方針 2)。移送先の description は既に issue 作成の瞬間で発火するため条件追加は不要
  • 5task-subagent-delegation の description 第 3 条件を削除する。対応する body 節が無く、実体(再帰 spawn 禁止)は skills/task-subagent-prompt/SKILL.md:49 にあり、同一の発火条件が既にそちらの description に載っている
  • 8body 側(判断の非対称性による per-judgment 選択)を正とする。 理由: Procedure step 4 が body の aggregation rule を参照して実行し、step 6 が three-value 分岐(consistent / partial / negative)を実行しているため、description の safer-side OR 既定は body の実行手順と両立しない。description から safer-side OR aggregation を削り、非対称性で選ぶ旨に改める。あわせて skills/evolution-impression-literal-detection/SKILL.md:30narrower than brake 1's default safer-side OR は比較参照先を失うため、閾値を絶対値で述べる形に改める(brake 1 側 Procedure step 4 の fixed-axis override 経路が既にあるので、参照先はそちらへ向ける)
  • 9 — Provides を body の実在節(stage definitions / execution mode / stage responsibility)に一致させる。存在しない entry/exit contract の約束を落とす
  • 10 — 本 issue の対象は operations-on-merge / operations-on-pr-review の Provides 句を body の post-merge 義務に一致させるところまで。trigger モードで merge の瞬間にセッションが存在しない経路は description の問題ではないため Post-merge obligations have no invocation anchor in trigger mode #1642 に分離した(LI_PLUS_REPO_EXE_MODE=semi_auto のため現行の self-evolution 経路では親が直接 merge し anchor は発火する)
  • 13task-pr-review-judgment の description に actor 軸(main agent)を書き足す。body 側の「operations skill を読むな」規定は触らない

対象ファイル

  • skills/operations-on-sub-issue/SKILL.md(1)
  • skills/operations-on-issue-maturity/SKILL.md + skills/operations-on-issue-format/SKILL.md(2、節の移送)
  • skills/operations-on-release/SKILL.md(3。移送先候補 = rules/evolution/cold-start-synthesis.md
  • skills/task-subagent-delegation/SKILL.md(5)
  • skills/operations-on-docs-ownership/SKILL.md(6)
  • skills/evolution-self-eval/SKILL.md(7)
  • skills/evolution-parallel-agent-eval/SKILL.md + skills/evolution-impression-literal-detection/SKILL.md(8、二者を同時に直す)
  • skills/evolution-loop/SKILL.md(9)
  • skills/operations-on-merge/SKILL.md + skills/operations-on-pr-review/SKILL.md(10)
  • skills/task-pr-review-judgment/SKILL.md(13)

完了条件(追加)

  • 各項目に上記の優先順が適用され、方針 3(description への条件追加)を選んだ項目については、その理由が PR 本文に記録されている

Metadata

Metadata

Assignees

No one assigned

    Labels

    done役目完了、orchestration (review / merge / close) フェーズ待ちready本文が実装開始できる形まで収束している状態。ただし更新は継続可能specLi+の挙動に影響する仕様・ポリシー・定義

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions