@@ -36,13 +36,14 @@ unictest の入力コーパスは EBM ノード種別の粒度では既に飽和
3636| ` Expression LITERAL_CHAR ` | 3 | ` tar ` , ` pg_wire ` , ` fb_dnsrocks ` |
3737| ` Statement CONTINUE ` | 1 | ` softether ` |
3838
39- 変換できない 72 個の内訳(当面の作業リスト)。
39+ 変換できない ` .bgn ` の内訳(当面の作業リスト)。着手時点は 72 個で、下記「経過」節の分だけ
40+ 減っている。
4041
4142** メッセージ単位で分類してはいけない。** ` Unexpected nullptr ` は ` common.hpp ` の
4243` unexpected_nullptr() ` 一箇所から出る汎用エラーで、メッセージだけで括ると無関係な原因が
4344混ざる(16 件に見えるが実際は 5 箇所に散っている)。エラーは ` handle_error ` が
4445` std::source_location ` を付けて伝播チェーンを出力するので、** 最深フレームで分類する** 。
45- その粒度では 72 件 = ** 38 グループ** 。
46+ その粒度では着手時点の 72 件が ** 38 グループ** だった 。
4647
4748主要なもの(件数はフレーム単位、2026-07-30 時点 = 58 件 / 35 グループ):
4849
@@ -136,40 +137,6 @@ callee 式しか手がかりが無い一般の `ast::Call` 用として残って
136137 ` omg_cdr.bgn ` ×1、` src/test/test_cases.bgn ` ×1)
137138- 回帰なし: ebm2go std-io が 74 PASS / 4 FAIL で、失敗する入力もエンディアンスコープ修正時点と同一
138139
139- ## 具体例
140-
141- 測定の手順は、各 ` .bgn ` を ` tool/ebmgen ` で EBM に変換し、` ebmgen -i <ebm> -d ` のテキスト
142- ダンプから ` Statement|Expression|Type <KIND> ` トークンの集合を取り、コーパス 21 フォーマットの
143- 和集合との差分を見るというもの。
144-
145- この測定に至る前は「実在フォーマットのワイヤデータを増やす」方向で TCP / HTTP/2 / DNS /
146- WebSocket / IPv6 に 21 サンプルを追加していた。それ自体は分岐網羅と境界値の面で意味があるが、
147- ** 構造の新規性という観点では頭打ち** であることが測定で判明した。
148-
149- ## これは X を意味しない
150-
151- - ** コーパスのカバレッジが十分という意味ではない。** 測定はノード種別の** 有無** しか見ておらず、
152- 構造の組み合わせ・ネストの深さ・再帰の段数・長さ式の演算内容は捉えていない。同じ種別集合でも
153- 生成コードは大きく異なり得る。「飽和」はこの指標に関しての言明。
154- - ** 既存フォーマットへのサンプル追加が無価値という意味ではない。** 境界値(ゼロ長・等号ちょうど・
155- 型幅上限)は型依存でバックエンド間の差が出る領域であり、種別粒度の測定には現れない。
156- ADR 0042 系の failure_case と合わせて引き続き有効。
157- - ** 72 個すべてを直すという計画ではない。** フレーム単位のグループが作業単位であり、どこから
158- 着手するかは別途決める。
159- - ** ` Unexpected nullptr ` が 16 件の単一原因という意味ではない。** 5 つの異なる箇所から出ており、
160- メッセージ単位の集計は誤り。フレームで分けること。
161-
162- ## 代替案
163-
164- - ** 言語間の値レベル差分** (全バックエンドがデコード結果を正規化 JSON で吐いて突き合わせる)。
165- 却下。全バックエンドは同じ EBM から派生するため、IR レベルで解釈がズレていれば全言語が同じ
166- 間違いをして一致する。捕まえられるのは単一バックエンドの lowering ズレだけで、18 言語分の
167- 実装コストに見合わない。
168- - ** 外部参照実装(scapy 等)との突き合わせ。** 却下。検出できるのは ` .bgn ` の定義が
169- プロトコル仕様と合っているかであって、brgen の変換の正しさではない。フォーマット仕様著者の
170- 責任側の話であり、CI に scapy 依存を持ち込む対価に見合わない(ADR 0021 の責任分界と整合)。
171- - ** ` --fuzz ` を CI に載せる。** 構造の妥当性には効かない。` ebm2rmw ` はモデルから入力を生成する
172- ので、fuzz 入力は構成上モデルと整合する。クラッシュ耐性の検査としては別途有効。
173140
174141## 経過: ビット連結に参加する struct メンバーの endian(2026-07-30)
175142
@@ -211,3 +178,38 @@ enum による上書きは従来のまま。連結時に外側フォーマット
211178- より後段へ移動した 2 件: ` media/ac3.bgn ` , ` ripple.bgn ` →
212179 ` transform/bit_fields.cpp:72 ` の ` Unexpected nullptr ` (同グループが 1 → 3 件に)
213180- 回帰なし: ebm2go std-io が 74 PASS / 4 FAIL で、失敗する入力も前段階と同一
181+
182+ ## 具体例
183+
184+ 測定の手順は、各 ` .bgn ` を ` tool/ebmgen ` で EBM に変換し、` ebmgen -i <ebm> -d ` のテキスト
185+ ダンプから ` Statement|Expression|Type <KIND> ` トークンの集合を取り、コーパス 21 フォーマットの
186+ 和集合との差分を見るというもの。
187+
188+ この測定に至る前は「実在フォーマットのワイヤデータを増やす」方向で TCP / HTTP/2 / DNS /
189+ WebSocket / IPv6 に 21 サンプルを追加していた。それ自体は分岐網羅と境界値の面で意味があるが、
190+ ** 構造の新規性という観点では頭打ち** であることが測定で判明した。
191+
192+ ## これは X を意味しない
193+
194+ - ** コーパスのカバレッジが十分という意味ではない。** 測定はノード種別の** 有無** しか見ておらず、
195+ 構造の組み合わせ・ネストの深さ・再帰の段数・長さ式の演算内容は捉えていない。同じ種別集合でも
196+ 生成コードは大きく異なり得る。「飽和」はこの指標に関しての言明。
197+ - ** 既存フォーマットへのサンプル追加が無価値という意味ではない。** 境界値(ゼロ長・等号ちょうど・
198+ 型幅上限)は型依存でバックエンド間の差が出る領域であり、種別粒度の測定には現れない。
199+ ADR 0042 系の failure_case と合わせて引き続き有効。
200+ - ** 72 個すべてを直すという計画ではない。** フレーム単位のグループが作業単位であり、どこから
201+ 着手するかは別途決める。
202+ - ** ` Unexpected nullptr ` が 16 件の単一原因という意味ではない。** 5 つの異なる箇所から出ており、
203+ メッセージ単位の集計は誤り。フレームで分けること。
204+
205+ ## 代替案
206+
207+ - ** 言語間の値レベル差分** (全バックエンドがデコード結果を正規化 JSON で吐いて突き合わせる)。
208+ 却下。全バックエンドは同じ EBM から派生するため、IR レベルで解釈がズレていれば全言語が同じ
209+ 間違いをして一致する。捕まえられるのは単一バックエンドの lowering ズレだけで、18 言語分の
210+ 実装コストに見合わない。
211+ - ** 外部参照実装(scapy 等)との突き合わせ。** 却下。検出できるのは ` .bgn ` の定義が
212+ プロトコル仕様と合っているかであって、brgen の変換の正しさではない。フォーマット仕様著者の
213+ 責任側の話であり、CI に scapy 依存を持ち込む対価に見合わない(ADR 0021 の責任分界と整合)。
214+ - ** ` --fuzz ` を CI に載せる。** 構造の妥当性には効かない。` ebm2rmw ` はモデルから入力を生成する
215+ ので、fuzz 入力は構成上モデルと整合する。クラッシュ耐性の検査としては別途有効。
0 commit comments