目的
PR #1652 は 3 ポートの並べ替えをロケール非依存に固定した(bash は LC_ALL=C sort、PowerShell は [System.StringComparer]::Ordinal)。しかし大小文字変換は同じ扱いになっていない。
- bash 側:
normalize_axis / record 内の tolower() は素のまま。LC_ALL=C が掛かっているのはパイプ末尾の sort だけ(adapter/claude/hooks/on-session-start.sh:557 の awk 起動には無く、:667 / :812 の sort にのみ有る)
- PowerShell 側:
.ToLowerInvariant() で不変固定
同一入力に対してホストのロケール次第でポート間の結果が割れうる。
確認済みの事実
前提
制約
- 3 ポート同時。bash 2 本だけ固定しても PowerShell と揃わなければ意味を成さない
LC_ALL=C を awk 起動全体に掛けると、awk の文字/バイトモードが変わり多バイト文字の length() / substr() の挙動に波及しうる。並べ替えの固定と同じ粒度で貼れる保証がないため、tolower() の呼び出し側だけを不変にする経路(ASCII 限定の自前変換など)と比較して決めること
layer: L1-model のファイルには触れない見込み
完了条件
- 3 ポートの大小文字変換がホストのロケールに依存せず一致する
- 多バイト文字を含む軸名に対する既存の挙動が変わっていない(回帰させないこと)
- 本番形の 3 ポートを検査するテストがある
対象ファイル
adapter/claude/hooks/on-session-start.sh
adapter/codex/hooks/on-session-start.sh
adapter/codex/hooks/on-session-start.ps1
tests/test_on_session_start_observation_surface.py
参照
目的
PR #1652 は 3 ポートの並べ替えをロケール非依存に固定した(bash は
LC_ALL=C sort、PowerShell は[System.StringComparer]::Ordinal)。しかし大小文字変換は同じ扱いになっていない。normalize_axis/record内のtolower()は素のまま。LC_ALL=Cが掛かっているのはパイプ末尾のsortだけ(adapter/claude/hooks/on-session-start.sh:557の awk 起動には無く、:667/:812の sort にのみ有る).ToLowerInvariant()で不変固定同一入力に対してホストのロケール次第でポート間の結果が割れうる。
確認済みの事実
tolower()が不変変換と食い違うのは実質トルコ語系ロケール(tr_TRのI→ı)に限られる。CI はubuntu-latestで走るため現状は露出していないsortがロケール非依存で一致する」であり、対象はsort。fix(hooks): axis-tag format spec and locale-pinned ordering across three session-start ports #1652 はその条件を満たしている(評価者 2 名が repo 全体を sweep して未固定サイトゼロを確認)前提
$axisCountの Ordinal 比較子は、正規化が全 return 経路で小文字化するため現状の入力では効かない(fix(hooks): axis-tag format spec and locale-pinned ordering across three session-start ports #1652 でコメントを訂正済)。この Ordinal 比較子が意味を持つのは、まさに本 issue の大小文字変換がポート間でずれた時だけ。ただしその時はキーが大小文字差ではなく別の文字列になっているため、比較子では救えない。つまりtolower()の固定こそが本体で、比較子は代替にならない制約
LC_ALL=Cを awk 起動全体に掛けると、awk の文字/バイトモードが変わり多バイト文字のlength()/substr()の挙動に波及しうる。並べ替えの固定と同じ粒度で貼れる保証がないため、tolower()の呼び出し側だけを不変にする経路(ASCII 限定の自前変換など)と比較して決めることlayer: L1-modelのファイルには触れない見込み完了条件
対象ファイル
adapter/claude/hooks/on-session-start.shadapter/codex/hooks/on-session-start.shadapter/codex/hooks/on-session-start.ps1tests/test_on_session_start_observation_surface.py参照