# Embedded Medical Device

> Firmware development for STM32, nRF52840, and RP2040 medical devices with BLE/USB communication, IEEE 11073 protocols, and secure data handling. When building point-of-care devices (pulse oximeters, BP monitors, glucose meters), embedded gateways, or medical IoT endpoints with TinyGo. Use when this capability is needed.

- Skill: `tomevault-io/embedded-medical-device` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/embedded-medical-device`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/embedded-medical-device/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/embedded-medical-device

---


# Embedded Medical Device Firmware Development

## Quick Start

### nRF5340-DK Dual-Core Medical Device (Recommended)

**Setup** (5 minutes):
1. Get nRF5340-DK ($99 from Nordic): includes J-Link debugger, USB UART, sensor connectors
2. Install TinyGo: `brew install tinygo` (supports nRF5340 in 0.40.0+)
3. Connect MAX30102 pulse ox sensor to I2C (GPIO 26=SDA, GPIO 27=SCL)
4. Connect serial monitor: `screen /dev/tty.usbmodem14101 115200`

**Application processor firmware** (runs on main Cortex-M33):

```go
package main

import (
	"github.com/tinygo-org/bluetooth"
	"machine"
	"time"
)

func main() {
	// Initialize sensors on application processor
	i2c := machine.I2C0
	i2c.Configure(machine.I2CConfig{
		Frequency: 100_000,
		SCL:       machine.GPIO27,
		SDA:       machine.GPIO26,
	})

	// Read sensor loop (never blocked by BLE on separate processor)
	ticker := time.NewTicker(10 * time.Millisecond) // 100 Hz sampling
	for range ticker.C {
		spo2 := readMAX30102(i2c) // 5µs I2C transaction
		hr := computeHeartRate(spo2)

		// Send to BLE (network processor handles async)
		sendToGATT(spo2, hr)
		println("SpO2:", spo2, "HR:", hr)
	}
}

func readMAX30102(i2c machine.I2C) uint8 {
	// Fast I2C read (doesn't block sensor loop thanks to dual-core)
	data := make([]byte, 2)
	i2c.ReadRegister(0x57, 0x07, data) // RED_LED_CONFIG
	return data[0]
}

func computeHeartRate(spo2 uint8) uint8 {
	return 72 // simplified; real firmware uses FFT on PPG waveform
}

func sendToGATT(spo2, hr uint8) {
	// Non-blocking send (network processor handles BLE)
	// See BLE section below
}
```

**Network processor firmware** (runs on Cortex-M4, handles BLE interrupts):

The Nordic SoftDevice runs on the network processor automatically. Your application processor calls BLE functions via IPC (Inter-Processor Communication), which is transparent to you—just use the `bluetooth` package as normal.

**Key benefit**: While BLE is advertising or transmitting, your sensor loop on the application processor runs **uninterrupted**. This guarantees real-time sensor data at 200+ Hz (required for pulse oximetry accuracy).

### Minimal BLE Pulse Oximeter (nRF52840)

```go
package main

import (
	"github.com/tinygo-org/bluetooth"
	"machine"
	"time"
)

func main() {
	// Initialize BLE peripheral role (medical device advertises itself)
	adapter := bluetooth.DefaultAdapter
	adapter.Enable()

	// GATT service for pulse oximetry (IEEE 11073-20601)
	adv := adapter.StartAdvertisement(&bluetooth.AdvertisementOptions{
		LocalName: "PulseOx-001",
	})

	// Simulate SpO2 reading (normally from ADC connected to LED)
	ticker := time.NewTicker(1 * time.Second)
	for range ticker.C {
		spo2 := readSensorValue() // 95-100% typically
		// Notify connected client with spo2 value
		_ = spo2
	}
}

func readSensorValue() uint8 {
	// Connect ADC to photodiode, compute SpO2 via FFT (see references/)
	return 97
}
```

### Key Architecture

```
Medical Device Firmware (TinyGo)
├── BLE/USB Transport (tinygo-org/bluetooth or machine/usb/cdc)
├── Sensor Integration (ADC, I2C, SPI)
├── IEEE 11073 Protocol Stack (lightweight Rust/Go bridge or pure Go)
├── Hardware Crypto (via CryptoAuth secure element over I2C)
├── Data Validation (agentskills embedded skill validation)
└── Secure Boot & Attestation (if available on target)
```

## Part 1: Target Microcontroller Selection

### nRF5340-DK (Recommended for Next-Generation Medical Devices)
- **Strengths**: Dual Cortex-M33 (Application + Network processors), 512 KB RAM, 1 MB flash, native BLE 5.3 + Thread, Matter support
- **Always-on core**: Network processor handles BLE interrupt processing independently (critical for real-time sensor data)
- **Use case**: Clinical-grade medical devices, continuous monitoring, low-power wireless gateways
- **TinyGo support**: Excellent (new support in TinyGo 0.40.0+)
- **Dev kit**: nRF5340-DK ($99, includes J-Link debugger, UART, multiple sensor connectors)
- **Binary footprint**: ~80-100 KB with BLE 5.3 stack (smaller than nRF52840 due to Cortex-M33 efficiency)
- **Power**: ~2.1 mA active BLE (vs 4 mA nRF52840), ideal for battery-powered medical devices
- **Key advantage**: Dual-core means BLE interrupt processing never blocks sensor sampling

**Medical advantage**: nRF5340's always-on network processor ensures **real-time sensor data** isn't missed during Bluetooth communication. Critical for pulse oximetry (200 Hz sampling) and ECG (500+ Hz).

**Architecture**:
```
nRF5340-DK
├── Application Processor (Cortex-M33)
│   ├── Main firmware (sensor logic, FHIR validation)
│   ├── I2C: MAX30102 (pulse oximetry) or other sensors
│   └── UART/SPI: Data logging to flash
│
└── Network Processor (Cortex-M4)
    ├── Nordic SoftDevice (BLE 5.3, Thread)
    ├── Always-on real-time processing
    └── Can wake application processor on events
```

**Comparison to nRF52840**:
| Feature | nRF5340-DK | nRF52840 |
|---------|-----------|---------|
| Dual-core | ✓ (M33+M4) | ✗ (single M4) |
| Real-time sensors | ✓ Never blocked | Shared with BLE |
| RAM | 512 KB | 256 KB |
| BLE version | 5.3 (latest) | 5.2 |
| Dev kit cost | $99 | $35-50 |
| Power (active) | 2.1 mA | 4.0 mA |
| Matter support | ✓ | ✗ |
| TinyGo 0.40+ | ✓ | ✓ |

**Recommendation**: Use **nRF5340-DK** for FDA submissions (dual-core ensures real-time guarantees), **nRF52840** for simple prototypes (cheaper, sufficient for low-frequency sensors).

### nRF52840 (Best for Medical BLE - Budget Option)
- **Strengths**: Native BLE (no WiFi complexity), 256 KB RAM, 1 MB flash, Nordic SoftDevice support
- **Use case**: Personal health devices (pulse oximeter, BP monitor, glucose meter)
- **TinyGo support**: Excellent (Adafruit boards pre-loaded with SoftDevice)
- **Boards**: Adafruit nRF52840 Feather, Arduino Nano 33 BLE, Pimoroni Tiny2040
- **Binary footprint**: ~60-80 KB with BLE stack
- **Limitation**: Single-core means sensor sampling and BLE communication compete for CPU

**Example**: nRF52840 Feather + Adafruit pulse oximeter breakout + ATECC608A secure element
```
nRF52840 Feather
├── SPI: ATECC608A (hardware crypto, tamper-resistant)
├── I2C: MAX30102 (pulse oximetry sensor)
├── GPIO: LED indicators, button
└── BLE: Advertises SpO2 readings to mobile app
```

### STM32F4/H7 (Clinical Bench Equipment)
- **Strengths**: Large flash (512KB-2MB), fast Cortex-M4/M7, extensive peripherals
- **Use case**: Benchtop analyzers, ECG machines, ventilator controllers
- **TinyGo support**: Partial (some ST NUCLEO boards supported)
- **Challenge**: No native BLE; requires external BLE module (e.g., nRF24L01 or separate nRF52)
- **Binary footprint**: ~80-120 KB (depends on protocol stack)

**Architecture**: STM32 + nRF24L01 bridge (separate MCU for wireless)
```
STM32F407 (clinical device logic)
├── UART1: Communication with nRF24L01 BLE bridge
├── ADC: Multi-channel sensor inputs (ECG leads, temperature, etc.)
├── Flash: 512 KB (firmware + patient data records)
└── SPI: SD card for data logging

nRF24L01 (separate TinyGo firmware)
├── BLE radio (if variant available)
├── Or: 2.4 GHz ISM band (medical telemetry)
└── UART back to STM32
```

### RP2040 (Emerging, Dual-Core Promise)
- **Strengths**: Cheap ($1-2), dual ARM Cortex-M0+, good peripherals
- **Use case**: Distributed sensor networks, gateway devices
- **TinyGo support**: Excellent (Raspberry Pi Pico native support, multicore in recent TinyGo)
- **Challenge**: Limited RAM (264 KB), no native Bluetooth (but can add external module)
- **Binary footprint**: ~40-60 KB minimal

**Emerging pattern**: RP2040 in star topology
```
Gateway RP2040 (multicore, runs edge WASI)
├── Core 0: Collects data from peripheral BLE devices (via USB host or separate radio)
├── Core 1: Processes FHIR serialization, validates with agentskills
└── USB-CDC: Streams structured data to medical gateway/EHR

Peripheral nRF52840 devices (pulse ox, BP monitor, glucose meter)
└── BLE: Advertises to gateway RP2040 (acting as central)
```

---

## Part 2: BLE and IEEE 11073 Protocol Stack

### BLE + GATT Structure for Medical Devices

IEEE 11073-20601 (Personal Health Device) defines GATT profiles:

```
Medical Device GATT Service
├── Device Information
│   ├── Manufacturer: "Boxxy Medical"
│   ├── Model: "PulseOx v1"
│   └── Serial: (from secure element)
├── Pulse Oximetry Service (0x180D1 custom)
│   ├── SpO2 Characteristic (read, notify)
│   ├── HR Characteristic (read, notify)
│   └── Status Characteristic (read)
├── Battery Service
│   ├── Battery Level (read, notify)
│   └── Battery Status (read)
└── Generic Access
    ├── Device Name: "PulseOx-ABC123"
    └── Appearance: 0x0C41 (Pulse Oximeter)
```

### TinyGo Bluetooth Example

```go
package main

import (
	"github.com/tinygo-org/bluetooth"
	"encoding/binary"
)

func main() {
	adapter := bluetooth.DefaultAdapter
	adapter.Enable()

	// Define GATT characteristics
	spo2Char := bluetooth.NewCharacteristic("SpO2",
		bluetooth.CharacteristicNotifyPermission,
		bluetooth.CharacteristicReadPermission)

	adapter.AddService(&bluetooth.Service{
		UUID: bluetooth.New16BitUUID(0x180D), // Pulse Oximetry
		Characteristics: []*bluetooth.Characteristic{spo2Char},
	})

	// Advertise
	adv := adapter.StartAdvertisement(&bluetooth.AdvertisementOptions{
		LocalName: "PulseOx-001",
		ServiceUUIDs: []bluetooth.UUID{
			bluetooth.New16BitUUID(0x180D),
		},
	})

	// Notify client of SpO2 change (97%)
	spo2 := uint8(97)
	data := []byte{spo2}
	spo2Char.Notify(data)
}
```

### Bridging to FHIR (on gateway)

For edge processing, the gateway (RP2040 or STM32+bridge) converts IEEE 11073 to FHIR:

```json
{
  "resourceType": "Observation",
  "code": {
    "coding": [{
      "system": "http://loinc.org",
      "code": "2708-6",
      "display": "Oxygen saturation in arterial blood"
    }]
  },
  "valueQuantity": {
    "value": 97,
    "unit": "%",
    "system": "http://unitsofmeasure.org",
    "code": "%"
  },
  "device": {
    "reference": "Device/PulseOx-ABC123",
    "identifier": {
      "system": "urn:oid:1.2.840.113556.4.5",
      "value": "ABC123"  // from secure element serial
    }
  }
}
```

---

## Part 3: Secure Element Integration (ATECC608A/B)

**Why hardware crypto**: Software crypto in TinyGo has failing test suites due to reflect limitations. FDA and IEC 62443 require certified, audited cryptography.

### Wiring (I2C)

```
nRF52840 Feather          ATECC608A (Adafruit Breakout)
├── GPIO 26 (SDA) -------> SDA
├── GPIO 27 (SCL) -------> SCL
├── GND ----------------> GND
└── 3.3V ----------------> VCC
```

### TinyGo Code

```go
package main

import (
	"github.com/waj334/tinygo-cryptoauthlib"
	"machine"
)

func main() {
	// Initialize I2C
	i2c := machine.I2C0
	i2c.Configure(machine.I2CConfig{
		Frequency: 100_000,
		SCL:       machine.GPIO27,
		SDA:       machine.GPIO26,
	})

	// Connect to secure element
	device, err := cryptoauthlib.NewATECC608A(i2c, cryptoauthlib.DefaultAddress)
	if err != nil {
		panic(err)
	}

	// SHA256 via hardware (faster, certified)
	data := []byte("patient_id_12345")
	hash, err := device.SHA256(data)
	if err != nil {
		panic(err)
	}
	// hash is now [32]byte

	// Sign challenge for device attestation
	challenge := [32]byte{} // received from medical gateway
	signature, err := device.Sign(challenge[:])
	if err != nil {
		panic(err)
	}
	// signature is ECDSA signature [64]byte
}
```

### FDA Compliance Path

1. **ATECC608A** is pre-certified for cryptographic operations (FIPS 140-2 candidate)
2. **TinyGo binary** compiled with `-no-debug` and hashing logic is auditable and small
3. **Device attestation** via ECDSA signature chain: Secure Element → Gateway → EHR
4. **Tamper-resistant storage**: ATECC608A stores root key securely, never transmitted

This satisfies **21 CFR Part 11** (electronic records, electronic signatures) and **IEC 62443-4-2** (secure development practices).

---

## Part 4: Skill Validation on Embedded Devices

The `embedded.go` skill validation subsystem provides capability checking without reflection or standard library bloat.

### Compact Skill Registry (for firmware capabilities)

```go
package main

import (
	"github.com/bmorphism/boxxy/internal/skill"
)

func main() {
	// Initialize registry
	registry := skill.NewRegistry()

	// Register firmware capabilities as skills
	pulseox := &skill.EmbeddedSkill{
		Name:        "pulse-oximetry",
		Description: "Read SpO2 and HR via MAX30102 sensor over I2C",
		Trit:        1, // Generator (+1) role
	}
	registry.Register(pulseox)

	tempsensor := &skill.EmbeddedSkill{
		Name:        "temperature-monitor",
		Description: "Monitor body temperature via DS18B20 1-wire sensor",
		Trit:        0, // Coordinator role
	}
	registry.Register(tempsensor)

	// Check if capabilities are balanced (GF(3) conservation)
	if registry.IsBalanced() {
		println("Device capabilities balanced")
	}

	// Serialize to EEPROM for capability advertisement over BLE
	compact := registry.SerializeCompact()
	// Send `compact` string to mobile app or medical gateway
}
```

### Over-the-Wire Capability Announcement (BLE)

```go
// Advertise firmware capabilities to connected gateway via characteristic
capabilitiesChar := bluetooth.NewCharacteristic(
	"FirmwareCapabilities",
	bluetooth.CharacteristicReadPermission,
)

registry := skill.NewRegistry()
// ... register device skills ...

compactStr := registry.SerializeCompact()
capabilitiesChar.SetValue([]byte(compactStr))

// Medical gateway reads this and understands device capabilities
// without needing internet or firmware update
```

---

## Part 5: Data Integrity and Medical Records

### IEEE 11073 + HMAC (Hardware-backed)

Every sensor reading includes an HMAC tag for integrity:

```go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/binary"
)

// SerializeReading formats a sensor reading with HMAC for transmission
func SerializeReading(spo2 uint8, hr uint8, timestamp uint32, hmacKey [32]byte) []byte {
	// Format: [spo2:1][hr:1][timestamp:4][hmac:32]
	buf := make([]byte, 38)
	buf[0] = spo2
	buf[1] = hr
	binary.LittleEndian.PutUint32(buf[2:6], timestamp)

	// Compute HMAC-SHA256
	h := hmac.New(sha256.New, hmacKey[:])
	h.Write(buf[:6]) // HMAC over spo2, hr, timestamp
	copy(buf[6:], h.Sum(nil))

	return buf
}

// VerifyReading checks HMAC on received reading
func VerifyReading(buf [38]byte, hmacKey [32]byte) bool {
	h := hmac.New(sha256.New, hmacKey[:])
	h.Write(buf[:6])
	expected := h.Sum(nil)
	received := buf[6:38]

	// Constant-time comparison (avoid timing attacks)
	for i := 0; i < 32; i++ {
		if expected[i] != received[i] {
			return false
		}
	}
	return true
}
```

This protects against:
- **Transit corruption** (electromagnetic interference in ICU/OR)
- **Replay attacks** (attacker records old reading, replays it)
- **Tampering** (someone modifies SpO2 value in transit)

---

## Part 6: Medical Device Gateway Pattern

For distributed sensor networks, deploy an RP2040 or STM32 gateway collecting from multiple BLE peripherals:

```
BLE Peripherals                Gateway                   Cloud/EHR
─────────────────              ───────                   ─────────
PulseOx-ABC123                 RP2040                    FHIR Validator
  ├─ BLE notify ──────────────>├─ BLE Central
  │                            ├─ Collect (Core 0)
  │                            │
  │                            ├─ WASI Process (Core 1)
  │                            │  - Validate SKILL.md capabilities
  │                            │  - Convert IEEE 11073 → FHIR
  │                            │  - Sign observations
  │                            │
  │                            ├─ USB-CDC ────────────> Medical Gateway
  │                            │                       (validates FHIR)
  │                            │                       (stores in EHR)
  │                            │
BP-Monitor-DEF456 ─ BLE ─────>└─ Synchronize
  └─ Multiple sensors
```

### WASI Edge Processing (TinyGo compiled for wasip1)

For FHIR serialization and complex logic, compile TinyGo to WebAssembly:

```bash
tinygo build -target=wasip1 \
  -o fhir_converter.wasm \
  github.com/bmorphism/boxxy/skills/embedded-medical-device/scripts/fhir_converter.go
```

This wasm module runs in a sandboxed runtime (wasmer, wasmtime) on the gateway:
- **Portable**: Same binary on Linux, macOS, Windows, embedded Linux
- **Secure**: Restricted to declared capabilities (file I/O, crypto, validation only)
- **Verified**: All GF(3) conservation laws checked before execution
- **Small**: ~100-200 KB (vs 1-2 MB for standard Go)

---

## Part 7: Testing on Real Hardware

### Compile for nRF5340-DK

```bash
# Requires TinyGo 0.40.0+
tinygo build -target=nrf5340-dk \
  -o pulse_ox_nrf5340.elf \
  main.go

# Flash via J-Link (included in nRF5340-DK dev kit)
nrfjprog --program pulse_ox_nrf5340.elf --chipversion qfxx --verify --reset
```

**Dual-core benefits in action**:
```bash
# Terminal 1: Watch serial output (application processor logs)
screen /dev/tty.usbmodem14101 115200
# Output: SpO2: 97 HR: 72 (continuous, never interrupted)

# Terminal 2: Run network monitor (shows BLE events)
nrf5340-monitor
# Output: BLE advertising event (doesn't affect terminal 1 output timing)
```

Unlike nRF52840, there's **no latency spike** in sensor output when BLE transmits.

### Compile for nRF52840

```bash
# Requires nRF5 SDK and Arm GCC
tinygo build -target=adafruit-feather-nrf52840 \
  -o pulse_ox.uf2 \
  main.go

# Copy .uf2 to Feather mass storage device (auto-flashes)
cp pulse_ox.uf2 /Volumes/FEATHERBOOT/
```

### Debug Output (Serial)

The Feather's USB connection provides a serial console:

```bash
# View serial output
screen /dev/tty.usbmodem14101 115200

# Typical output:
# BLE enabled
# Device: PulseOx-ABC123
# SpO2: 97%, HR: 72 [HMAC verified ✓]
# SpO2: 97%, HR: 73 [HMAC verified ✓]
# ...
```

### Test on STM32F407

```bash
# Requires STM32CubeMX + OpenOCD
tinygo build -target=nucleo-f407zg \
  -o ecg_monitor.elf \
  main.go

# Flash via JTAG
openocd -f interface/stlink.cfg \
        -f target/stm32f4x.cfg \
        -c "program ecg_monitor.elf verify reset exit"
```

---

## Part 8: Integration with blackhat-go Skill

The `embedded-medical-device` skill complements `blackhat-go` by implementing **defensive** medical device firmware:

| Aspect | blackhat-go | embedded-medical-device |
|--------|-----------|-------------------------|
| **Goal** | Identify vulnerabilities in medical data access | Secure medical device firmware |
| **Tools** | Network scanning, protocol fuzzing, data extraction | Hardware crypto, GATT validation, HMAC integrity |
| **Data** | Intercepts patient records in transit | Protects sensor data at source |
| **Auth** | Breaks weak auth via network attacks | Implements device attestation via secure element |
| **Use** | Red-team, vulnerability research | Clinical deployment, FDA submission |

**Combined workflow**:
1. Use `blackhat-go` to identify attack surfaces in hospital network
2. Use `embedded-medical-device` to harden firmware against those attacks
3. Deploy validated devices with agentskills capability attestation
4. Monitor via FHIR/SMART for compliance

---

## Part 9: References

### Hardware

- **nRF52840 Feather**: https://www.adafruit.com/product/3406
- **MAX30102** (pulse oximetry breakout): https://www.ams.com/sensors/max30102
- **ATECC608A** (secure element): https://www.microchip.com/en-us/product/atecc608a

### TinyGo Support

- **Bluetooth package**: https://github.com/tinygo-org/bluetooth
- **tinygo-cryptoauthlib**: https://github.com/waj334/tinygo-cryptoauthlib
- **TinyGo drivers**: https://tinygo.org/docs/reference/machine/

### Medical Standards

- **IEEE 11073-20601** (Personal Health Device): https://ieee.org/
- **FHIR R4 Observation**: https://hl7.org/fhir/r4/observation.html
- **21 CFR Part 11**: Electronic records, electronic signatures (FDA)
- **IEC 62443-4-2**: Secure development practices

### Design Resources

- **Adafruit learning guides**: https://learn.adafruit.com/
- **STM32 reference manuals**: https://www.st.com/
- **ATECC608A application notes**: https://microchip.com/

---

## Part 10: Validation Checklist for Medical Device Firmware

Before clinical deployment:

- ✓ All sensor readings include HMAC integrity tags
- ✓ Device attestation via ECDSA signature (from secure element)
- ✓ BLE encryption enabled (AES-128-CCM per Bluetooth 5.0 spec)
- ✓ Firmware signed with trusted key (in ATECC608A)
- ✓ Capability advertisement via skill registry (agentskills validation)
- ✓ FHIR output validated against schema (gateway WASI runtime)
- ✓ IEC 62443 Secure Development Practices applied
- ✓ Binary audit log enabled (tamper-resistant storage on secure element)
- ✓ 21 CFR Part 11 audit trail (gateway logs all device events)

---

## Part 11: Building Blocks (Code Examples)

See `scripts/` directory:
- `pulse_oximeter_main.go` - Complete nRF52840 pulse ox firmware
- `ecg_gateway.go` - RP2040 multi-sensor gateway (dual-core)
- `fhir_converter.go` - WASI module for IEEE 11073 → FHIR
- `crypto_utils.go` - ATECC608A integration helpers
- `skills_registry_example.go` - Embedded skill validation demo

See `references/` directory:
- `IEEE_11073_GUIDE.md` - Protocol stack explanation
- `FHIR_MEDICAL_DEVICE_MAPPING.md` - IEEE 11073 field → FHIR element mapping
- `SECURE_ELEMENT_SETUP.md` - ATECC608A provisioning and key management
- `FDA_SUBMISSION_CHECKLIST.md` - Regulatory compliance steps

---

This skill bridges **TinyGo embedded development** with **medical device standards** and the **agentskills.io specification**. Use it to build secure, validated, formally-checkable medical device firmware.

✅ **Validation Status**: This skill is self-validating—it teaches agents how to build medical devices that validate themselves via embedded skill registries and GF(3) conservation laws.

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/plurigrid) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

