Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .github/workflows/nexting-devices-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ jobs:
javascript-and-boundary:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm run check
Expand All @@ -29,7 +29,7 @@ jobs:
swift:
runs-on: macos-latest
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@v4
- run: swift test
- run: >-
swiftc -warnings-as-errors -o /tmp/nexting-device-sim
Expand All @@ -39,18 +39,18 @@ jobs:
kotlin:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-java@v5
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- uses: gradle/actions/setup-gradle@v6
- run: ./gradlew test
- uses: gradle/actions/setup-gradle@v4
- run: gradle test
working-directory: devices/sdk/kotlin

c99:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/checkout@v4
- run: cmake -S devices/sdk/c -B build -DNEXTING_DEVICE_SANITIZE=ON
- run: cmake --build build && ctest --test-dir build --output-on-failure
93 changes: 15 additions & 78 deletions .github/workflows/nexting-devices-firmware.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ on:
- "devices/west.yml"
- ".github/workflows/nexting-devices-firmware.yml"
push:
tags:
- "devices-v*"
paths:
- "devices/firmware/**"
- "devices/sdk/c/**"
Expand All @@ -32,13 +30,11 @@ jobs:
include:
- board: nrf52840dk/nrf52840
artifact: nrf52840dk
flash: west flash with the onboard SWD debugger
- board: xiao_ble/nrf52840/sense
artifact: xiao-nrf52840-sense
flash: copy zephyr.uf2 to the XIAO BLE mass-storage bootloader
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: zephyrproject-rtos/action-zephyr-setup@v1
Expand All @@ -48,30 +44,14 @@ jobs:
sdk-version: 0.17.4
west-version: 1.5.0
- run: west build -p always -b ${{ matrix.board }} devices/firmware/zephyr
- name: Package self-describing firmware asset
env:
BOARD: ${{ matrix.board }}
ARTIFACT: ${{ matrix.artifact }}
FLASH: ${{ matrix.flash }}
run: |
set -eu
bundle="nexting-device-${ARTIFACT}-${GITHUB_SHA}"
mkdir -p "${bundle}"
for image in build/zephyr/zephyr.elf build/zephyr/zephyr.bin build/zephyr/zephyr.hex build/zephyr/zephyr.uf2; do
if [ -f "${image}" ]; then cp "${image}" "${bundle}/"; fi
done
test -n "$(find "${bundle}" -type f -print -quit)"
(
cd "${bundle}"
sha256sum zephyr.* > SHA256SUMS
printf '{\n "schemaVersion": 1,\n "sourceCommit": "%s",\n "board": "%s",\n "artifact": "%s",\n "flash": "%s",\n "zephyr": "4.3.0",\n "zephyrSdk": "0.17.4",\n "west": "1.5.0",\n "evidence": "Build verified",\n "boardVerified": false\n}\n' \
"${GITHUB_SHA}" "${BOARD}" "${ARTIFACT}" "${FLASH}" > artifact-manifest.json
)
tar -czf "${bundle}.tar.gz" "${bundle}"
- uses: actions/upload-artifact@v7
- uses: actions/upload-artifact@v4
with:
name: nexting-device-${{ matrix.artifact }}-${{ github.sha }}
path: nexting-device-${{ matrix.artifact }}-${{ github.sha }}.tar.gz
path: |
build/zephyr/zephyr.elf
build/zephyr/zephyr.bin
build/zephyr/zephyr.hex
build/zephyr/zephyr.uf2
if-no-files-found: error

espressif:
Expand All @@ -82,13 +62,11 @@ jobs:
include:
- board: xiao_esp32c3/esp32c3
artifact: xiao-esp32c3
flash: west flash through the Espressif serial bootloader
- board: xiao_esp32s3/esp32s3/procpu
artifact: xiao-esp32s3
flash: west flash through the Espressif serial bootloader
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: zephyrproject-rtos/action-zephyr-setup@v1
Expand All @@ -99,52 +77,11 @@ jobs:
west-version: 1.5.0
- run: west blobs fetch hal_espressif
- run: west build -p always -b ${{ matrix.board }} devices/firmware/zephyr
- name: Package self-describing firmware asset
env:
BOARD: ${{ matrix.board }}
ARTIFACT: ${{ matrix.artifact }}
FLASH: ${{ matrix.flash }}
run: |
set -eu
bundle="nexting-device-${ARTIFACT}-${GITHUB_SHA}"
mkdir -p "${bundle}"
for image in build/zephyr/zephyr.elf build/zephyr/zephyr.bin build/zephyr/zephyr.hex; do
if [ -f "${image}" ]; then cp "${image}" "${bundle}/"; fi
done
test -n "$(find "${bundle}" -type f -print -quit)"
(
cd "${bundle}"
sha256sum zephyr.* > SHA256SUMS
printf '{\n "schemaVersion": 1,\n "sourceCommit": "%s",\n "board": "%s",\n "artifact": "%s",\n "flash": "%s",\n "zephyr": "4.3.0",\n "zephyrSdk": "0.17.4",\n "west": "1.5.0",\n "evidence": "Build verified",\n "boardVerified": false\n}\n' \
"${GITHUB_SHA}" "${BOARD}" "${ARTIFACT}" "${FLASH}" > artifact-manifest.json
)
tar -czf "${bundle}.tar.gz" "${bundle}"
- uses: actions/upload-artifact@v7
- uses: actions/upload-artifact@v4
with:
name: nexting-device-${{ matrix.artifact }}-${{ github.sha }}
path: nexting-device-${{ matrix.artifact }}-${{ github.sha }}.tar.gz
path: |
build/zephyr/zephyr.elf
build/zephyr/zephyr.bin
build/zephyr/zephyr.hex
if-no-files-found: error

release:
if: startsWith(github.ref, 'refs/tags/devices-v')
needs:
- nordic
- espressif
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
pattern: nexting-device-*-${{ github.sha }}
path: release-assets
merge-multiple: true
- name: Publish immutable Experimental release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "${GITHUB_REF_NAME}" release-assets/*.tar.gz \
--repo "${GITHUB_REPOSITORY}" \
--prerelease \
--title "Nexting Devices SDK ${GITHUB_REF_NAME#devices-v}" \
--notes "Public Experimental release. Firmware assets are Build verified with pinned Zephyr 4.3.0, Zephyr SDK 0.17.4, and west 1.5.0. They are not Board verified; inspect each artifact-manifest.json and the repository conformance guide."
67 changes: 6 additions & 61 deletions devices/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,69 +4,14 @@ This file records changes to public protocol behavior, shared vectors, SDK surfa

## Unreleased

### Changed

- Reframed the Quickstart around the device–Host–Agent architecture and split
the XIAO two-button exercise into a clearly labeled Developer Reference
tutorial.
- Added a machine-readable SDK and public developer-enrollment availability
source for the repository and website.
- Expanded the security model with implemented BLE protection, Host
authorization and freshness checks, minimum disclosure, volatile-state
clearing, and the production identity boundary.

## 0.2.0-experimental.2 — 2026-07-29

This release keeps wire major 1 and adds seven frozen interaction profiles
without changing `approval/1` or `status/1`.

### Added

- Frozen interaction profiles `navigation/1`, `keys/1`, `rotary/1`, `voice/1`,
`text/1`, `usage/1`, and `config/1`.
- Shared valid and hostile vectors plus JSON Schema definitions for all 15 new
messages.
- Strict JavaScript, fixed-buffer C99, Swift 6, and Kotlin implementations of
every new message.
- Device Info profile negotiation helpers and Host-side profile gating.
- Sequence numbers for replay/out-of-order rejection on navigation, key,
rotary, and push-to-talk input.
- Versioned, atomic configuration results. Invalid configuration leaves the
current device configuration unchanged.

### Changed

- The Codex Host guide now distinguishes the official high-level SDK from App
Server and freezes the fail-closed one-time approval projection into
`approval/1`.
- `voice/1` carries control only. Audio capture, permission, and transcription
stay on the Host microphone; audio and transcripts never cross this BLE
profile.

## 0.2.0-experimental.1 — 2026-07-28

This developer-experience release keeps wire major 1 and the `approval/1` and
`status/1` profiles unchanged.

### Added

- A public XIAO nRF52840 Quickstart with exact wiring, flashing, expected
output, and an explicit public-App availability gate.
- A rerunnable Zephyr 4.3.0 / west 1.5.0 / SDK 0.17.4 bootstrap with board
aliases, dry-run output, isolated Python dependencies, and actionable errors.
- A macOS `nexting-device-host-smoke` executable that validates Device Info,
uses encrypted BLE, presents one synthetic approval, and emits a
machine-readable real-button `PASS`.
- Setup, toolchain, flashing, Bluetooth, Device Info, and public-App
troubleshooting.

### Changed

- Public docs no longer require unpublished product software.
- Claude Code and Codex docs separate published protocol surfaces from roadmap
profiles and from public App availability.
- Website SDK pages have stable shareable routes and include Kotlin/Android as
a first-class Host reference.
- A source-first ILX MultiPad USB CDC developer binding that reuses the portable
C99 state machine, preserves the upstream HID and `AA BB xx` commands, and
includes a host-side CMake contract test.
- A GitHub-ready MultiPad guide, conservative Device Info template, CDC smoke
check, and fail-closed STM32 serial-flash preparation script. Physical board
and bootloader evidence remain explicitly pending.

## 0.2.0-experimental.0 — 2026-07-27

Expand Down
20 changes: 10 additions & 10 deletions devices/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ Unknown, malformed, unauthorized, stale, duplicate, replaced, or expired input m

## Run evidence appropriate to the change

| Change | Minimum evidence |
| --- | --- |
| Protocol or vectors | JavaScript, Swift, Kotlin, and C sanitizer suites |
| Swift host SDK | Swift tests and build; consuming product integration tests when Host-facing behavior changes |
| Public documentation system | Documentation contract, links, public-boundary, naming, and diff checks |
| C device core | CMake build and CTest with ASan/UBSan |
| BLE simulator | Private integration contract and warnings-as-errors `swiftc` build |
| Reference firmware | Firmware contract plus every affected pinned board build |
| Hardware claim | Complete dated real-iPhone checklist for the exact board and firmware commit |
| Documentation only | Link, public-boundary, naming, and diff checks |
| Change | Minimum evidence |
| --------------------------- | -------------------------------------------------------------------------------------------- |
| Protocol or vectors | JavaScript, Swift, Kotlin, and C sanitizer suites |
| Swift host SDK | Swift tests and build; consuming product integration tests when Host-facing behavior changes |
| Public documentation system | Documentation contract, links, public-boundary, naming, and diff checks |
| C device core | CMake build and CTest with ASan/UBSan |
| BLE simulator | Private integration contract and warnings-as-errors `swiftc` build |
| Reference firmware | Firmware contract plus every affected pinned board build |
| Hardware claim | Complete dated real-iPhone checklist for the exact board and firmware commit |
| Documentation only | Link, public-boundary, naming, and diff checks |

The exact commands and current known failures live in [`docs/development.md`](docs/development.md). Do not delete, skip, or weaken a failing security assertion to make a branch green.

Expand Down
97 changes: 0 additions & 97 deletions devices/QUICKSTART.md

This file was deleted.

Loading
Loading