目的
LI_PLUS_WEBHOOK_DELIVERY の値を大小文字混在で書いたとき、bash port と PowerShell port が別の挙動になる。3 port の parity を回復する。
観測事実(2026-08-24 実測)
比較演算子が port ごとに違う既定を持つ:
| port |
行 |
演算子 |
大小文字 |
adapter/claude/hooks/on-user-prompt.sh |
:28 |
[ "$WEBHOOK_DELIVERY" != "mcp_hook" ] |
区別する |
adapter/codex/hooks/on-user-prompt.sh |
:39 |
同上 |
区別する |
adapter/codex/hooks/on-user-prompt.ps1 |
:41 |
$webhookDelivery -ne 'mcp_hook' |
区別しない(PowerShell の -ne は既定で case-insensitive) |
同一ホスト上で実測:
'Mcp_Hook' -ne 'mcp_hook' -> False (PowerShell: 等しいと見なす)
[ "Mcp_Hook" != "mcp_hook" ] -> true (bash: 異なると見なす)
したがって LI_PLUS_WEBHOOK_DELIVERY=Mcp_Hook と書かれた workspace では、bash port は呼び出し半分を emit し、PowerShell port は抑止する。同じ config を読んで逆の結論に至る。
channel 値についても同形。
前提
論点
方向は3つある。
- 正規化:3 port とも読み取り直後に小文字化して比較する(bash は
tr '[:upper:]' '[:lower:]'、PowerShell は .ToLowerInvariant())。混在値を受け入れる方向。
- 厳格化:PowerShell 側を
-cne にして case-sensitive へ揃える。混在値を拒否する方向。未知の値は既定(poll)へ落ちるため、Mcp_Hook は poll 扱いになる。
- 検証:未知の値を検出して警告を emit する。
Li+config.md のテンプレートは小文字で書かれており、コメントも小文字の3値を列挙している。したがって混在値は設定ミスであり、受け入れるべきものか拒否すべきものかがそのまま方向1と2の分かれ目になる。rules/model/subtractive-structural-beauty.md の「binary only — required or unnecessary」に照らせば、黙って一方に倒れる現状(port ごとに別の方へ倒れる)が最も悪い、という点は方向によらず共通。
決める前に、同じ config を読む他の値(LI_PLUS_MODE / LI_PLUS_CHANNEL / LI_PLUS_BASE_LANGUAGE / LI_PLUS_PROJECT_LANGUAGE)が3 port でどう比較されているかを掃引すること。本件だけを直すと同じクラスが残る。
変更予定ファイル(方向未確定のため暫定)
adapter/claude/hooks/on-user-prompt.sh / adapter/codex/hooks/on-user-prompt.sh / adapter/codex/hooks/on-user-prompt.ps1
adapter/claude/hooks/on-session-start.sh / adapter/codex/hooks/on-session-start.sh / adapter/codex/hooks/on-session-start.ps1 —— 掃引の結果、同じクラスが在れば
tests/ —— 3 port × 混在値の契約テスト
目的
LI_PLUS_WEBHOOK_DELIVERYの値を大小文字混在で書いたとき、bash port と PowerShell port が別の挙動になる。3 port の parity を回復する。観測事実(2026-08-24 実測)
比較演算子が port ごとに違う既定を持つ:
adapter/claude/hooks/on-user-prompt.sh:28[ "$WEBHOOK_DELIVERY" != "mcp_hook" ]adapter/codex/hooks/on-user-prompt.sh:39adapter/codex/hooks/on-user-prompt.ps1:41$webhookDelivery -ne 'mcp_hook'-neは既定で case-insensitive)同一ホスト上で実測:
したがって
LI_PLUS_WEBHOOK_DELIVERY=Mcp_Hookと書かれた workspace では、bash port は呼び出し半分を emit し、PowerShell port は抑止する。同じ config を読んで逆の結論に至る。channel値についても同形。前提
WEBHOOK_DELIVERY/webhookDeliveryを含む変更行はコメント・docs・テスト定数のみであることを親が確認済)。したがって fix(adapter): keep the webhook handling re-arm in every delivery mode [hooks, tests, docs] #1802 の回帰ではなく、fix(adapter): keep the webhook handling re-arm in every delivery mode [hooks, tests, docs] #1802 が露出させた既存の欠陥である。#1632F2 クラス)。本件はその同じクラスの未処理分。Parent retainsであるため起票していない。判断は親が行った。論点
方向は3つある。
tr '[:upper:]' '[:lower:]'、PowerShell は.ToLowerInvariant())。混在値を受け入れる方向。-cneにして case-sensitive へ揃える。混在値を拒否する方向。未知の値は既定(poll)へ落ちるため、Mcp_Hookは poll 扱いになる。Li+config.mdのテンプレートは小文字で書かれており、コメントも小文字の3値を列挙している。したがって混在値は設定ミスであり、受け入れるべきものか拒否すべきものかがそのまま方向1と2の分かれ目になる。rules/model/subtractive-structural-beauty.mdの「binary only — required or unnecessary」に照らせば、黙って一方に倒れる現状(port ごとに別の方へ倒れる)が最も悪い、という点は方向によらず共通。決める前に、同じ config を読む他の値(
LI_PLUS_MODE/LI_PLUS_CHANNEL/LI_PLUS_BASE_LANGUAGE/LI_PLUS_PROJECT_LANGUAGE)が3 port でどう比較されているかを掃引すること。本件だけを直すと同じクラスが残る。変更予定ファイル(方向未確定のため暫定)
adapter/claude/hooks/on-user-prompt.sh/adapter/codex/hooks/on-user-prompt.sh/adapter/codex/hooks/on-user-prompt.ps1adapter/claude/hooks/on-session-start.sh/adapter/codex/hooks/on-session-start.sh/adapter/codex/hooks/on-session-start.ps1—— 掃引の結果、同じクラスが在ればtests/—— 3 port × 混在値の契約テスト