6.2 KiB
Node discovery admission and wireless enrollment R3
The owner tested the newly installed private K1 package through the Core Fleet UI after clearing Chrome cache. At 11:55 MSK, choosing Find K1 produced an unconfirmed-action notification. The board continued reporting idle with no discovery generation change. Installation and worker readiness from R2 remain valid observations; physical discovery was not accepted by that readiness check.
Proven defect
NodeBridge passed duration_seconds and operation_id to discovery.scan,
but omitted expected_snapshot_runtime_id. The real XgridsK1PluginFacade
requires that field before invoking its BLE service. It raised
SnapshotRuntimeConflict before discovery, and the worker's generic HTTP 409
became the broker's unconfirmed-action result. Journald had no diagnostic entry
because that exception was deliberately swallowed without logging.
The earlier Node test replaced the facade, so it did not exercise this real admission boundary. A regression test now replaces only the physical service: the original code reproduces SnapshotRuntimeConflict; the fixed code admits one scan with the exact requested runtime ID and rejects an old runtime without another service call. No BLE I/O occurs in this test.
The adapter now forwards the admitted command's runtime ID. The runtime fence itself is unchanged. Worker failures also emit only the admitted action and exception class to the service journal; exception text, request bodies, credentials and device data are never logged there.
Owner-approved UI composition
The operator job is adding a supported wireless sensor to the chosen onboard computer through its device-list plus action, in Core or the Node application. The owner requested the same bounded modal with the title «Подключение беспроводных устройств к БК» and a supported-device selector first. The selector comes from installed sensor UI contributions. No hardware form or request is mounted before choosing the model. Only XGRIDS LixelKity K1 is currently contributed; a second model is not claimed to have a backend.
The host owns WirelessEnrollmentWindow and the selector; the selected plugin owns its device workflow and actions through a typed render contract. This replaces the single EnrollmentView slot that disappeared whenever more than one plugin supplied a view. Ambiguous contribution IDs remain unavailable. The alternative of putting a hard-coded model dropdown inside the K1 plugin was rejected because it would leave the shared plus action owned by one vendor.
After choosing the K1 model, the operator can search Bluetooth and choose a found scanner. Wi-Fi selection, credentials and Connect appear only for that selected current candidate. Search, network lookup, verification and Connect show their pending indicator and text inside their own button; the detached bottom indicator is removed. Repeated actions/model changes are disabled during an operation; closing stops observation without replaying or cancelling the physical intent. Runtime/discovery changes retire selected-device credentials.
This is domain content in the existing modal. It reuses the pinned Design Guideline Button, ActivityIndicator compact icon slot, Select, Window, WindowFooterActions, ResourceRow, SettingsCard, TextField, StatusBadge and ToastStack. No design-system geometry, CSS, icon or new product root was added. Core Fleet and Node share the same component. LAB, recorded and live Rerun settings and the K1 network/acquisition recovery state machine were not edited.
Software acceptance
- Core architecture: 4 checks passed; TypeScript passed.
- Core full frontend suite: 787 passed, no failures or skips.
- Core production build passed; canonical port 8000 serves the exact new index with Cache-Control no-store and operational readiness true.
- Node UI boundary check, TypeScript and production build passed; Go build and Go package tests passed.
- 25 Python Node bridge, installer/import-boundary and Fleet enrollment checks passed, including the real-facade regression and retained secret/idempotency checks. Ruff and whitespace checks passed.
Node 0.8.1 and private K1 0.1.1+private.1 identify the replacement release; previous R2 artifact bytes are retained. Exact source/release hashes and board installation results belong in the following acceptance addendum. Hardware UI discovery, provisioning, camera/LiDAR and recovery remain pending until a new owner run with cache cleared before the test.
Installed release
The exact source commit is 77acb377e2a996f70eb6e24f38e9a924da8be023.
The private directory private/releases/mission-core-node-k1-20260907-r3
contains both packages, install and SHA256SUMS.
| Package | Bytes | SHA-256 |
|---|---|---|
mission-core-node_0.8.1_amd64.deb |
109813420 | 13c96905d32fb665c5fee4b76d1704a24507c5c62afc68186561bae83cd678f2 |
mission-core-xgrids-k1_0.1.1+private.1_amd64.deb |
318106574 | 03b34b11f0608608dad2b366f86903afef39b5c85d042b3ec37f819ab322a95a |
Both archive provenances, the packaged runtime-fence fix and private member permissions were checked. Transferred hashes matched; APT simulation selected two upgrades and zero removals. The owner completed Ubuntu authentication and the installer exited successfully. At 09:17 UTC on 07.09.2026, the Mini started Node 0.8.1 and K1 0.1.1+private.1. Both services are active/running with NRestarts=0. Installed provenance and the runtime-fence source match this commit. Reinstall preparation accepted the existing application profile. Fleet receives the new runtime through the preserved original binding.
The owner was instructed to clear Chrome cache again for the next UI test.
Read-only observations with UTC/monotonic timestamps are kept under
private/acceptance/k1-node081-20260907-core-ui. Successful hardware discovery,
Bridge and live output are not inferred from service readiness.
Git publication of the preceding installation report 2fdf1d3 was rejected
before execution by automatic approval review, citing internal deployment
metadata and requiring explicit authorization for that payload/destination.
The owner has been asked; no alternative push was used to bypass the decision.
The R3 source and report are currently committed locally on top of that report.