feat(uno-q): ship the arduino-uno-q expert skill on every node by default

Vendors the comprehensive UNO Q skill (SKILL.md + 7 references/*.md) and installs
it into EVERY agent's workspace on each board, so agents know this board's
specifics (dual-brain arch, Bridge/RPC, pin tables, LED matrix + the
ArduinoGraphics-not-installed gotcha) instead of guessing generic Arduino.

Why per-agent workspace: ZeroClaw's read_skill returns only SKILL.md; the agent
reads references/*.md via the workspace-sandboxed file_read tool, so references
are only reachable under ~/.zeroclaw/agents/<alias>/workspace/skills/. A
shared/skills bundle surfaces the skill but its references get sandbox-blocked.

- push-skill.sh installs a SKILL.md+references skill into every agent workspace
  (discovers aliases from the board); provision-fleet runs it per board.
- config.template risk profile now allows + auto-approves read_skill + file_read
  so agents load skills without a human approver (webhook path is non-interactive).
- Flattened the folded 'description: >-' to single-line (ZeroClaw's frontmatter
  parser is a flat scanner, not full YAML).

Verified on board 65301572 with cloud/Sonnet-5: discovered arduino-uno-q →
read_skill(SKILL.md) → file_read references/04-bridge-rpc.md → correct
board-specific answer citing the file.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Omar Sobh
2026-07-16 09:14:00 -07:00
co-authored by Claude Opus 4.8
parent 7233a4b1c0
commit d2135a1938
12 changed files with 877 additions and 2 deletions
@@ -0,0 +1,108 @@
# UNO Q — Hardware & Specifications
## Architecture at a glance
The UNO Q combines two processors on one classic UNO form-factor board:
| Role | Chip | Details | Runs |
|---|---|---|---|
| **MPU (Linux side)** | Qualcomm **QRB2210** (Dragonwing) | Quad-core Arm Cortex-A53 @ **2.0 GHz**; Adreno 702 GPU @ 845 MHz; dual ISP up to 25 MP @ 30 fps | **Debian Linux** (full OS, upstream support) |
| **MCU (Arduino side)** | **STM32U585** | Arm Cortex-M33 @ up to **160 MHz**, **2 MB flash**, **786 KB SRAM** | Arduino sketches on **Zephyr OS** |
| **Radio** | **WCBN3536A** | Dual-band **Wi-Fi 5** (2.4/5 GHz) + **Bluetooth 5.1**, onboard antennas | — |
| **Multimedia codec** | **ANX7625** | Video/audio out over the USB-C connector (DisplayPort) | — |
| **PMIC** | Qualcomm **PM4145** | Power management | — |
The two processors are internally linked by a dedicated serial connection managed by the `arduino-router` service (see the Bridge reference). There is no need — and it is a mistake — to bridge them with external wires.
## Memory & storage variants
- **RAM:** 2 GB or 4 GB **LPDDR4**.
- **Storage:** 16 GB or 32 GB **eMMC**.
- Product SKU family: **ABX00162 … ABX00173**.
- Arduino recommends the **4 GB** variant for standalone / single-board-computer use (running the desktop + App Lab on-device). The 2 GB variant is fine when driven from a PC in Network Mode.
## Powering the board
Three supported ways to power it (choose one):
1. **USB-C** cable providing **5 VDC / 3 A** (cable not included). 15 W sink.
2. External **+5 VDC** to the **5V** pin.
3. External **+724 VDC** to the **VIN** pin.
For a standalone desk setup the usual path is a USB-C multiport (dongle) adapter with external power delivery feeding the board while also breaking out HDMI/USB. **Apple's USB-C dongle has been tested and found incompatible** — use a non-Apple multiport adapter.
The board **boots automatically when powered** — you do not press the power button to start it.
## USB-C connector — it does far more than power/programming
| Feature | Capability |
|---|---|
| USB power (sink) | 5 VDC / 3 A (15 W) |
| USB standard | USB 3.1 Gen 1 (5 Gb/s) |
| Display over USB-C | DisplayPort output |
With a USB-C **dongle** you additionally get: **HDMI** video out, **USB camera** input, **audio** (USB or 3.5 mm headset), **Ethernet**, **HID** (keyboard/mouse), and **storage** (microSD/USB drive). This is what makes SBC mode possible.
## Form factor & connectors
- **Classic Arduino UNO form factor** → compatible with the huge existing range of UNO **shields**.
- **Two connector tiers:**
- **UNO-style headers** on top — prototyping/debugging, shield-compatible.
- **High-speed header connectors** on the bottom (JMISC, JDIGITAL, JANALOG, JCTL, etc.) exposing extra digital pins and low-level interfaces.
- Pinout PDF, datasheet, schematics, and STEP files are published on the Arduino docs product page (model ABX00162). Point users there for mechanical/CAD detail.
## Onboard user interface
### 8×13 blue LED matrix (MCU-controlled)
- 104 LEDs (8 rows × 13 cols), driven by the STM32.
- Library: `Arduino_LED_Matrix.h`. Draw a frame from a `uint8_t[104]` array.
- Supports **grayscale/dimming**: `matrix.setGrayscaleBits(bits)` — e.g. `3` → 8 levels (07), `8` → 256 levels (0255).
```cpp
#include <Arduino_LED_Matrix.h>
Arduino_LED_Matrix matrix;
uint8_t frame[104] = { /* 8 rows of 13 values */ };
void setup() {
matrix.begin();
matrix.setGrayscaleBits(1); // 1 bit = on/off
matrix.draw(frame);
}
void loop() {}
```
### 4× RGB LEDs — split across both processors
- **LED 1 & LED 2 → controlled by the MPU (Linux)** via the sysfs LED class at `/sys/class/leds/...`.
- **LED 3 & LED 4 → controlled by the MCU (sketch)** via `digitalWrite()` on named pins.
- **All onboard RGB LEDs are ACTIVE-LOW** — logic `0` / `LOW` turns a segment **ON**.
MPU (Linux) sysfs names:
- LED 1: `red:user`, `green:user`, `blue:user`
- LED 2: `red:panic`, `green:wlan`, `blue:bt`
```bash
echo 1 | tee /sys/class/leds/red:user/brightness # ON
echo 0 | tee /sys/class/leds/red:user/brightness # OFF
```
Or from Python via App Lab's helper:
```python
from arduino.app_utils import App, Leds
Leds.set_led1_color(1, 0, 0) # LED1 red on
Leds.set_led1_color(0, 0, 0) # LED1 off
```
MCU (sketch) pin names: `LED3_R/LED3_G/LED3_B`, `LED4_R/LED4_G/LED4_B` — remember active-low:
```cpp
pinMode(LED3_R, OUTPUT);
digitalWrite(LED3_R, LOW); // red ON (active-low)
```
### Power button
- **Long press (5+ seconds) → reboots the Linux system.**
- Not needed to power on (auto-boots on power).
### Hardware debug UART (system console)
- A dedicated low-level UART on the **JCTL** connector exposes the SoC's main console (bootloader messages + Linux shell login).
- **Parameters: 115200 bps, 1.8 V logic.**
- ⚠️ **1.8 V logic only** — you must use a **1.8 V** USB-to-TTL converter (e.g. DSD Tech SH-U09C5). Using a 3.3 V/5 V adapter can damage the board.
- Use for deep debugging when the board won't boot or the network is unavailable; ordinary work should use SSH instead.