# 報告された解析失敗12録音で、最初に失敗した検査項目を記録する

2026-10-26。元の固定120録音比較とは別の、実音声による事後的な原因調査。実行前に以下を固定し、固定時点では追加のnative呼出しは行っていない。

## 目的と対象外

元の比較では、担当報告上12録音が係数1の解析で止まった。形状の有効性検査が7件、完全な雑音状態の検査が5件である。しかし元の入口は、失敗した状態を解放して一般的な状態コードだけを返すため、元のログからフレーム・項目・値を復元できない。

診断情報を加えた別binaryで、この12録音の同じ予定入力を各1回だけ解析する。得たいものは最初の失敗項目とその値であり、音声品質の改善ではない。新しい観測を元の120録音の欠測へ代入せず、元の解析・品質個票、失敗件数、計画を変更しない。品質モデル、復号、係数最適化、再抽出、パラメーター探索は実行しない。

元アーカイブは大容量保存の認証エラーで親が取得できていない。今回の対象選択は担当から報告された失敗一覧に基づく。診断版で同じ状態コードが出ても、元実行の内部状態と完全一致した証明にはならない。診断情報の追加やコンパイルの違いが浮動小数点の振る舞いを変える可能性を残す。同じ失敗が出なかった場合も、そのまま記録して追加実行で合わせない。

## 入力と呼出しを固定する

元から保持しているLibriSpeechの原入力とpYIN状態を使う。原入力のNPY全体SHAを照合し、NumPy 2.3.5・SciPy 1.17.0で従来と同じ3/2の再標本化を行う。得られたfloat64の全配列SHAを元の因子抽出記録と照合してから、native用float32へ変換する。時計は全状態について float32(60 * 2 ** ((state % 488) / 120)) とし、元の保存状態と対応するSHAを記録する。F0推定は再実行しない。

解析条件は24 kHz、5 ms格子、元の正の時計、全係数1、乱数seed 0。入力の正規化、振幅の切り詰め、F0の変更、無音除外、便宜的な形状補完は加えない。12件を元manifest順に並べ、5担当へ巡回分配する。担当ごとの件数は3・3・2・2・2になる。

新しい診断用binaryだけを明示したSHAで使い、録音ごとに独立したプロセスで一度呼ぶ。nativeの状態コードと同じスレッドの診断256 bytesを直後に取得し、解釈前のhexも残す。返却した観測はcleanupより前に保存する。プロセス異常やtimeoutは不明として保持し、科学呼出しを再試行しない。nativeが拒否したことと、診断の記録が完了したことを別の状態として扱う。

## 成功しても失敗しても、その観測を残す

診断には、解析中の段階、フレーム、帯域・調波・要素の番号、失敗した項目と述語、観測した整数またはfloat32の生bitsを含める。未取得の値を0として扱わず、非有限値もJSONのNaNへ変換しない。状態コード4・5以外の粗い診断や、診断取得自体の失敗も隠さない。

診断版で解析が成功した場合は、状態コード0、診断が空だったこと、返却長などを記録し、そこで終了する。完全な特徴や波形を保存・復号して元比較を代替しない。結果の問いは「この診断版でどの検査が最初に失敗したか、または報告された拒否を再現しなかったか」に限る。

全入力manifest・入力配列、固定ソース、各録音の診断記録・raw bytes・予約・終了状態・ログを保持する。元の大型結果ZIPを縮小する処理ではない。今回の対象は新しく生成される小さい診断記録であり、元の未取得アーカイブは別の未解決として残す。

## 五役の二巡で、再採点と原因診断を分ける

親による仮想討議。第一巡で、数値担当は状態4をHMPPの失敗と即断できないと指摘した。実装担当は失敗状態が解放済みなので後から値を取得できないとした。評価担当は欠測を成功値へ置換する危険を挙げた。記録担当は元アーカイブの未取得を隠さないことを求め、批評家は単に同じ大規模評価を繰り返さず、次の判断が変わる最小の観測に限定するよう求めた。

第二巡では、12件の事後診断を別計画・別binary・一回ずつに限定した。状態4・5の最初の失敗項目だけを観測し、復号と品質モデルを禁止する。成功・拒否・不明の全結果を残し、元比較の有効件数と採否へ混ぜない。得た項目を見てから、数値条件が不適切なのか、モデルや表現の適用範囲なのかを検討する。

診断情報のC ABIとPython側の保持処理は静的レビュー済み。診断用binaryはコンパイル・リンク・保持・照合まで完了している。12件の入力と来歴、実行ソース、手順、保持範囲をこの版に固定する。各担当は同じ入力を一度だけ解析し、観測と終了状態を全件保存する。
