75 lines
3.5 KiB
Markdown
75 lines
3.5 KiB
Markdown
# 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;
|
|
- 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;
|
|
- 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.
|