[aside] otel.span の typed attribute は write 境界では検証されるが projection では opaque な VARCHAR JSON に落ちる ── 個別属性での query(例: http.status_code=500 で絞る)は json_extract 頼みで、型付きの旨味が read 層では閉じていない

PR #385 で `otel_spans.attributes_json` は serde で型検証した属性マップを **JSON 文字列**として 1 列に格納(kernel の「属性セットは Entity-upsert に畳む」に沿う)。前段の設計議論で「typed attribute の価値 = queryability」と述べたが、それは write 検証までで、read 側は DuckDB の json_extract を噛ませないと個別属性で引けない。

- 今回触らない判断: first-cut は型 + 検証 + 最小 projection が目的で、属性の query 性は範囲外にした。
- トリガー: 属性での絞り込み/集計が実需になったとき。hot な属性(http.status_code 等)を列に昇格、もしくは DuckDB の JSON 型 + json_extract を使う follow-up。