7月最終週。今週は シミュレータが無い。 検証もボードが無ければ通らない。
今週の Signal
ボードが自分の画面を差し出した。「ボードが自分の画面を差し出す」は、机の上の STM32H723 を USB シリアルで、ESP32 を mDNS で見つけて Wi-Fi TCP で繋いだ。二台のボードがそれぞれ画面定義を出し、ボタンを押せば LED が実際に点く。クライアントのコードは二つの場合で一文字も違わない — 変わるのはどのブリッジプログラムを起動するかだけだ。
同じチップに三つの端末が繋がった。「チップひとつに繋げば」は店の決済端末の横にサーバーをひとつ立て、タブレット・PC・厨房の画面を繋ぐ。三台のどれにもアプリを作らず、カード承認の経路は一行も触っていない。
道具・パッケージのメモ
今週の本当の収穫は記事ではなく 見つけた欠陥 だ。実機に繋いだ途端 listResources() が即死した。
type 'Null' is not a subtype of type 'String' in type cast
最初はボードを疑った。ところが MCP 仕様では resource の description は任意 であり、ボードはそれを送らなかっただけだ。ボードが正しかった。mcp_client 1.1.1 がそのフィールドを非 null にキャストしており、2.1.0 では既に直っていた。
なぜ今まで見えなかったのか。listResources() を呼ぶ消費者が稀だからだ。initialize → tools/list → tools/call → resources/read だけを回す経路はそのコードを通らない。仕様で任意のフィールドを必須として受け取るパーサは、仕様を守った相手に会ったときにだけ死ぬ。 そしてその出会いはたいてい、実機が繋がる日に来る。
短い考え
シミュレータはたいてい我々が書いたとおりに答える。だから我々が誤解した箇所をそのまま通してしまう。今週確かめたのは性能でも利便でもなく、それだ — 実機は我々の思い違いに同意してくれない。
来月
現場の端末へ降りる。待ち行列、倉庫の動線、交代の引き継ぎ、回線の切れたレジ。
makemind.dev 「更新」— 週に一度、その週に何が上がり、作りながら何に引っかかったか。