実装・再設計担当 AI 向け仕様(必読)
この文書は説明用 README ではなく、将来の変更時に既存合意を再現するための拘束条件と確認手順である。推測で設計を変更しない。日本語版の正本は docs/ja/agent-contract.md、英語版は docs/en/agent-contract.md。
目的と変更禁止条件
単一の共通
DeviceProxyは、デバイスクラス名から登録済みcreatorを呼び出すファクトリ。通信方式の抽象化、デバイスの共通インターフェイス、RPC の統一、サーバー探索ではない。デバイスクラス名はプロセス内で一意。重複登録はエラー。同名クラスを transport 名で区別しない。
HTTP (
ese774_frame)、gRPC (grpc_frame)、Tango (tango_frame) は独立。共通モジュールはそれらを import しない。各デバイスパッケージの専用クライアントクラスが型情報の正本。汎用ベースクライアントの
.pyiで代用しない。継承・追加・オーバーライドされたメソッドの署名は専用クライアント.pyiに従う。HTTP/gRPC の同期・非同期選択は登録された
creatorの責務。共通DeviceProxyはasync_modeを解釈せず**kwargsを転送する。Tango に async/sync ペアを強制しない。config、api_spec、接続引数はデバイス・フレームワーク固有。共通側は解析しない。自動探索、entry_points、ネットワーク探索、デバイス DB を導入しない。登録は明示的な Python 実行による。
直接クライアント利用、デバイスパッケージ固有の
DeviceProxy、共通DeviceProxyのいずれも妨げない。将来 DDS/MQTT を想定して RPC 型 API や
async_modeを共通仕様にしない。現時点で実装されていると主張しない。デバイスパッケージ名、実在クラス名、コンストラクタは必ず実際のソースで確認する。
CobottaClientのような架空クラスを作らない。
デバイスパッケージの最小契約
実際に生成される専用クライアントクラスを提供する。HTTP/gRPC では例えば
AsyncCobottaClientとSyncCobottaClientのような実在のクラス。専用クラスは基本クラスを継承するだけでもよい。デバイスクラス名を決め、重複しないようにする。登録
register_device_proxy(name, creator)はユーザーが明示的に実行できる位置に配置する。import 時登録は選択肢であり必須ではない。同期・非同期の組があるなら
make_async_sync_factory(async_client_cls=..., sync_client_cls=..., default_async_mode=...)を利用できる。専用クラスが一つならクラスを直接 creator として渡せる。クライアント固有の
.pyiをデバイスパッケージ側で管理する。サーバー API の自動公開分だけでなく、クライアント側で追加・オーバーライドしたメソッドの署名を含める。共通
DeviceProxyの型補完が必要なら、デバイス名と専用クライアントの完全修飾名を型対応 JSON に記述し、共通core.pyiを再生成する。クライアント API の内容をコピーしない。各パッケージ固有の
DeviceProxyと共通DeviceProxyは別のレジストリである。両者を利用する場合は、それぞれへの登録が必要。既存ファクトリを無断で共通レジストリへ移さない。
型生成の厳密な制約
typing_generator.generate_device_proxy_pyiは、明示的な型対応 JSON からcore.pyiを生成する。実行時の登録を自動検出しない。生成時にデバイスモジュールを import しない。生成する型宣言は
Literal[device_class]と専用クライアント型の import だけ。各専用クライアントの.pyiを型チェッカーが解決する。Python の静的型チェッカーは、別モジュールの同名
DeviceProxyの overload を自動合成しない。共通のDeviceProxyの戻り型を自動補完するには共通core.pyiに対応を列挙する必要がある。単なるインポート時登録だけでは実現しない。生成先はこのパッケージの
src/device_proxy_factory/core.pyi。更新後、共通パッケージを再ビルド・再インストールする。インストール済み site-packages を書き換えることを標準手順にしない。型対応 JSON に列挙した専用クライアントパッケージは、その型を利用する環境にインストールされている必要がある。共通パッケージのランタイム依存には追加しない。
追加デバイスに応じて共通
core.pyiを再生成する手動工程は残る。全デバイスの自動発見は行わない。これは仕様上の制約であり隠さない。
変更前チェック
/mnt/data等で提供された HTTP/gRPC/Tango の実コードと既存生成器を読む。DeviceProxyが引数をそのまま creator に渡すこと、重複登録エラー、複数デバイス共存をテストする。専用クライアントの override が型スタブで保持されることを静的型チェッカーで検証する(ユニットテストだけでは静的型検査は確認できない)。
ユーザーの承認なしにパッケージ名、登録方式、同期・非同期仕様を変更しない。