# XGRIDS / LixelKity K1 plugin This directory is the package boundary for the first Mission Core device plugin. It now owns the canonical v1alpha2 manifest [`plugin.manifest.json`](plugin.manifest.json). The statically linked frontend contribution lives in `apps/control-station/src/device-plugins/xgrids-k1/`; the verified backend implementation remains temporarily in `src/k1link` so the real-device path stays operational during extraction. The v1alpha2 catalog can describe one or more independently profiled models. This manifest currently exposes only `xgrids.lixelkity-k1`, and the transitional runtime still owns one active model/session at a time. Concurrent model/session routing remains a later supervisor milestone. The plugin owns: - the exact firmware/topology compatibility profiles under [`profiles/`](profiles/), with strict evidence flags and a fail-closed loader; - BLE discovery hints and K1 GATT metadata; - the reviewed firmware-3 Wi-Fi provisioning profile; - K1 LAN status and private-address validation; - subscribe-only MQTT transport and report-topic allowlist; - native `.k1mqtt` capture; - firmware-scoped protobuf/LZ4 and legacy codecs; - normalization of K1 point cloud and pose, plus raw-only preservation of the still-undecoded status and heartbeat channels; - exact-profile left/right RTSP producer selection, H.264 copy-remux preview and the handoff of acquisition-owned init/fMP4/index evidence to the host archive; - K1-specific operator instructions and compatibility tests. The plugin does not own: - Mission Core navigation, fleet, missions, users, roles, or audit; - the generic spatial scene or Rerun Web Viewer; - the host observation catalog, RRD preparation/cache, recorded-camera player, workspace layout, platform storage, remote transport, or other devices. Until extraction is complete, `src/k1link` is the compatibility source of truth and every move into this package must preserve replay and real-device acceptance. Mission Core imports this plugin only from `apps/control-station/src/composition/devicePlugins.ts`. The generic shell never branches on this plugin ID or reads `k1_ip`, BLE candidates, MQTT topics, or other vendor state. Backend startup loads the reviewed factory declared by `backendEntrypoint`, then cross-checks its plugin ID and complete action set against this manifest. Actions enter through the host dispatcher and the transitional facade `src/k1link/web/xgrids_k1_facade.py`. The old flat routes live in the plugin's legacy router; both paths delegate to the same proven `XgridsK1CompatibilityService` methods. Synchronous capture/runtime operations run outside the FastAPI event loop. Model switching calls the plugin deactivation hook. An active acquisition uses semantic `acquisition.stop` in `capture-only` mode; replay and pre-v1alpha2 sessions retain the legacy `stream.stop` shim. Neither path claims that the physical K1 stopped without separate operator evidence. BLE, MQTT, codec and evidence modules remain in `src/k1link` until replay parity and another physical K1 regression are complete. The compatibility profile is descriptive and cannot itself authorize a vendor write. The current runtime cannot inspect K1 firmware: it keeps the profile inactive until the operator explicitly attests firmware `3.0.2` and direct-LAN topology, and records that basis as `operator-attested` rather than device-derived evidence. Validate the current exact-match profile without device I/O with: ```bash uv run python plugins/xgrids-k1/profile_loader.py ``` The optional owner-controlled iPhone/LixelGO observation tool lives under [`lab/iphone-capture/`](lab/iphone-capture/). It pins `pymobiledevice3` in a separate `uv` environment, writes only ignored evidence sessions, and remains a lab subprocess rather than a plugin/runtime dependency. The first capture is gated by ADR 0004 and ADR 0005.