forgo.cloud
Sign in
Repo workspace

forkjoin-ai/gnosis

R1 fleet inventory

distributed-inference/docs/R1_FLEET.md
forkjoin-ai/gnosis

R1 fleet inventory

Living inventory of the Rabbit R1 mesh nodes (catch-and-release). 6 devices total (5 live, 1 to flash). Network: WiFi "Hawk", 10.0.0.0/24. Data port 8090, gossip UDP 9090. Model: qwen05-dense.knot (qwen2.5-0.5b); stage plan 0..12,12..24 exists as a fallback, but the model (373 MB) fits each node's RAM so fit-aware election makes every node role=both (serves the whole model 0-24 as a data-parallel lane — N nodes = N full lanes, no entry bottleneck). Last updated 2026-05-24 (gossip-NodeStatus build, all nodes hardware-hash-named).

Devices

Node id = r1-<bitwise hash of ANDROID_ID> (hardware-derived, privacy-preserving — raw id never gossiped; stable across re-flash). Set with equip.sh -n auto (the default). The old friendly r1-0..r1-3 names were retired 2026-05-24.

node (hash) was serial android build wifi ip role status
r1-b50eb85c r1-0 919109A4H16000691813 13 (sdk33) GSI gsi_r1 10.0.0.199 both released, live on WiFi
r1-7513bea5 r1-1 919109A6U160125835C7 13 (sdk33) GSI gsi_r1 10.0.0.240 both released, live on WiFi
r1-9d76f8e5 r1-2 919109A6B1600836591B 16 (sdk36) BSP k65v1_64_bsp 10.0.0.67 both released, live on WiFi
r1-05384d3c r1-3 919109A6U160125647C7 13 (sdk33) GSI gsi_r1 10.0.0.196 both released, live on WiFi
r1-14ec8106 (r1-4 slot) 919109A491600012265B 16 (sdk36) BSP k65v1_64_bsp 10.0.0.64 both released, live on WiFi
to flash r1-5 TBD flash -> 16 -> k65v1_64_bsp self-elect 1 remaining
  • Role is NOT pinned — every node self-elects from gossip (--auto-stage). With a node-fitting model the election returns role=both (full model); for a model too big for one node it falls back to the under-replicated 0..12/12..24 split. Re-elects to cover a dark stage.
  • Mesh state: 5 full-model both lanes, all new-build (gossip NodeStatus). Each node advertises live health (RAM / load / in-flight / jammed) on the heartbeat; /chain routes around jammed peers. curl http://<ip>:8090/mesh/hive -> healthy.
  • Inspect any live node: curl http://<ip>:8090/status (this node's health) · /mesh/peers (topology + every peer's gossiped status) · /mesh/hive (2002 brain digest + X-Mesh-Status).
  • Management after release: every node has adb-over-wifi (equip --tcpip): adb connect <ip>:5555. (Caveat: adb tcpip is not persistent — a reboot drops it until the next equip; HTTP /status still works regardless.)

Android 16 is the target

We prefer the Android 16 build (r1-2, the 919109A6B... "B" serial, k65v1_64_bsp, sdk 36) — nicer than the Android 13 GSI units. Plan: flash the 2 remaining units to Android 16, and re-flash the Android-13 GSI units (r1-0/r1-1/r1-3) to Android 16 as they cycle through. The in-app node + prep flow work on both (the Android-16 BSP build needed two extra fixes the GSI didn't — both now handled by equip.sh --apk):

  • WebView provider unset -> launcher crashed at init. Fixed: set-webview-implementation.
  • GMS absent -> appops failed. Fixed: GMS appops tolerated.

Prep flow per device (catch -> equip -> release)

  1. Flash the Android 16 image with the mtkclient "unknot" toolkit in packages/aeon-r1-unknot (the R1 is a MediaTek MT6765). This is the only hardware step.
  2. Knot: adb -s <serial> push qwen2.5-0.5b-instruct.knot /data/local/tmp/qwen05-dense.knot (or rely on --knot-url for R2 first-boot download — too many knots to push them all).
  3. Equip (one command — does install + all OS prep + launch):
    APK=open-source/aeon-shell/.../app-universal-debug.apk
    bash open-source/gnosis/distributed-inference/scripts/r1/equip.sh \
      -s <serial> --stages 0..12,12..24 --seed http://<live-node>:8090 \
      -p <live-ip>:9090 --tcpip --apk "$APK"   # [--knot-url https://<r2>/...]
    No -n -> the node self-names from its hardware hash (r1-<hash>). Installs the APK, sets launcher + WebView provider, lockscreen off / provisioned, grants audio/camera, applies the power config (screen sleeps to save heat; CPU + WiFi stay up via wakelock/WifiLock + no-doze so the node keeps serving with the display off), writes the self-election conf, enables adb-over-wifi, launches. The node auto-elects (both for a node-fitting model) and joins.
  4. Release: unplug. It survives reboots autonomously (proven on Android 13 + 16).

Seed --seed/-p from any LIVE node's :8090/:9090 (e.g. 10.0.0.64). The old seed 10.0.0.199 is now r1-b50eb85c (re-id'd); any live node works.

Re-id an already-equipped node to its hardware hash (over wifi-adb, no re-plug):

adb -s <ip>:5555 shell 'sed -i "s/^NODE_ID=.*/NODE_ID=auto/" /data/local/tmp/mesh-node.conf'
adb -s <ip>:5555 shell 'am force-stop run.aeon.shell; monkey -p run.aeon.shell -c android.intent.category.LAUNCHER 1'
# verify: curl http://<ip>:8090/status  (node_id is now r1-<hash>)

Notes

  • The aeon-shell APK is built per docs/R1_INAPP_NODE.md (carries libfatstation.so).
  • IPs are DHCP — they can change across reboots; the node auto-detects its wlan0 IP, so only the (hardware-hash) node-id is stable. Re-check IPs via adb or the gossip view.
  • "B"-prefix serial (919109A6B...) and the 919109A49... unit are the Android-16 BSP batch (k65v1_64_bsp, sdk 36); "U"/"H" prefixes are the Android-13 GSI units.