Authoring VPhone Patch Sets
Lakr233/vphone-cli
Explains how to declare a firmware patch in a vphone patch set, add a new set, or write a preset, including naming, gating and the checks that catch undeclared patches.
Review and implement hardware driver code — DMA safety, interrupt correctness, timing constraints, peripheral register usage, channel drivers, and peripheral mock implementations.
$ npx skills add FastLED/FastLED --skill driver-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install FastLED/FastLED driver-review --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/driver-review .claude/skills/driver-review && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .claude/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-reviewType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add FastLED/FastLED --skill driver-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install FastLED/FastLED driver-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/driver-review .agents/skills/driver-review && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .agents/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FastLED/FastLED --skill driver-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install FastLED/FastLED driver-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/driver-review .cursor/skills/driver-review && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .cursor/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/FastLED/FastLED.git --path .claude/skills/driver-review--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add FastLED/FastLED --skill driver-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install FastLED/FastLED driver-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/driver-review .gemini/skills/driver-review && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .gemini/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install FastLED/FastLED driver-reviewInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add FastLED/FastLED --skill driver-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/driver-review .github/skills/driver-review && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .github/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FastLED/FastLED --skill driver-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install FastLED/FastLED driver-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FastLED/FastLED.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/driver-review .opencode/skills/driver-review && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "driver-review" agent skill from https://github.com/FastLED/FastLED/tree/master/.claude/skills/driver-review into .opencode/skills/driver-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "driver-review", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
driver-reviewReview and implement hardware driver code — DMA safety, interrupt correctness, timing constraints, peripheral register usage, channel drivers, and peripheral mock implementations.
Driver Review is an agent skill from FastLED/FastLED. Review and implement hardware driver code — DMA safety, interrupt correctness, timing constraints, peripheral register usage, channel drivers, and peripheral mock implementations. Use when writing, modifying, or reviewing LED drivers, SPI/I2S/RMT/UART/PARLIO/LCDCAM peripherals, GPIO configuration, or peripheral mock code.
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Embedded systems. The repository describes itself as: The FastLED library for colored LED animation on Arduino. Please direct questions/requests for help to the FastLED Reddit community: http://fastled.io/r We'd like to use github… The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit ce225ed. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Driver Review loads about 3.1k tokens when it runs. Until then it costs about 85 tokens; SKILL.md has 762 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from FastLED/FastLED at commit ce225ed, republished under its MIT licence (© FastLED). 762 words, ~3,133 tokens.
.claude/skills/driver-review/SKILL.md (or your agent's skills folder).Review and implement hardware driver code changes for embedded-specific safety and correctness issues.
git diff --cached and git diff to see all changesFiles matching these patterns:
src/platforms/** — Platform-specific implementationssrc/fl/channels/** — LED channel engine and DMA pipeline**/drivers/** — Hardware driver implementationsMALLOC_CAP_INTERNAL | MALLOC_CAP_DMA__attribute__((aligned(4))) or aligned allocator)esp_cache_msync() or non-cacheable memory for DMAIRAM_ATTR (ESP32) or proper section attributesmalloc, new, fl::vector) inside ISRsportMAX_DELAY = 0 only)printf, FL_DBG, FL_WARN, or logging in ISRsxQueueSendFromISR, not xQueueSend)portENTER_CRITICAL_ISR not portENTER_CRITICAL)true if higher-priority task woken)vTaskDelay(1) or yield() in busy loops to prevent watchdog resetshow() waits for poll() == READY before starting new framefl::micros(), sleep_for) — use mSimulatedTimeUspumpDeferredCallbacks() with re-entrancy guardwaitDone() returns instantly — never polls or sleepsreset() clears ALL state — called between test cases for isolationfl::Singleton<Impl>#ifdef ESP32, #ifdef FL_IS_ARM) correct and completesrc/platforms/*/int.h)FastLED's driver stack has three layers:
IChannelDriver (driver.h — show/poll state machine)
└─ ChannelEngine* (groups channels by timing, iterates chipset groups)
└─ IPeripheral (virtual interface — real HW or mock)
├─ PeripheralEsp (real ESP-IDF calls)
└─ PeripheralMock (synchronous test simulation)foosrc/platforms/esp/32/drivers/foo/
├─ ifoo_peripheral.h # Virtual interface (no ESP-IDF types)
├─ foo_peripheral_esp.h # Real hardware implementation
├─ foo_peripheral_mock.h # Mock class declaration
├─ foo_peripheral_mock.cpp.hpp # Mock implementation (synchronous)
└─ channel_driver_foo.cpp.hpp # Channel driver using IFooPeripheral
tests/platforms/esp/32/drivers/foo/
├─ foo_peripheral_mock.cpp # Mock peripheral unit tests
└─ channel_driver_foo.cpp # Driver integration testsReference implementations:
src/platforms/esp/32/drivers/i2s/src/platforms/esp/32/drivers/lcd_cam/src/platforms/esp/32/drivers/parlio/Define the virtual interface in ifoo_peripheral.h:
void*, u16*, basic types onlyFL_NOEXCEPT overridegetMicroseconds(), delay(ms)registerCallback(void* fn, void* ctx)// Lifecycle
bool mInitialized, mEnabled, mBusy;
size_t mTransmitCount;
FooConfig mConfig;
// ISR callback
void* mCallback;
void* mUserCtx;
// Simulation settings
u32 mTransmitDelayUs;
bool mTransmitDelayForced;
bool mShouldFailTransmit;
// Test inspection
fl::vector<TransmitRecord> mHistory;
// Pending state
size_t mPendingTransmits;
// Simulated time (deterministic — advances only via delay() calls)
u64 mSimulatedTimeUs;
// Synchronous callback pump
bool mFiringCallbacks; // Re-entrancy guard
size_t mDeferredCallbackCount; // Pending callbacks to firetransmit() — Queue + pump:
bool transmit(const u16* buffer, size_t size_bytes) {
if (!mInitialized || mShouldFailTransmit) return false;
// Capture data for test inspection
TransmitRecord record;
record.buffer_copy.resize(size_bytes / 2);
fl::memcpy(record.buffer_copy.data(), buffer, size_bytes);
record.size_bytes = size_bytes;
record.timestamp_us = mSimulatedTimeUs;
mHistory.push_back(fl::move(record));
// Queue + fire synchronously
mTransmitCount++;
mBusy = true;
mPendingTransmits++;
mDeferredCallbackCount++;
pumpDeferredCallbacks();
return true;
}waitDone() — Instant check, never polls:
bool waitDone(u32 timeout_ms) {
if (!mInitialized) return false;
(void)timeout_ms; // Not used — synchronous mock
if (mPendingTransmits == 0) { mBusy = false; return true; }
return false;
}pumpDeferredCallbacks() — Re-entrant safe:
void pumpDeferredCallbacks() {
if (mFiringCallbacks) return; // Re-entrancy guard
mFiringCallbacks = true;
while (mDeferredCallbackCount > 0) {
mDeferredCallbackCount--;
fireCallback();
}
mFiringCallbacks = false;
}fireCallback() — One callback at a time:
void fireCallback() {
if (mPendingTransmits > 0) mPendingTransmits--;
if (mPendingTransmits == 0) mBusy = false;
if (mCallback != nullptr) {
using CallbackType = bool (*)(void*, const void*, void*);
auto fn = reinterpret_cast<CallbackType>(mCallback);
fn(nullptr, nullptr, mUserCtx);
}
}Time simulation:
u64 getMicroseconds() { return mSimulatedTimeUs; }
void delay(u32 ms) { mSimulatedTimeUs += static_cast<u64>(ms) * 1000; }reset() — Full state reset:
void reset() {
mInitialized = mEnabled = mBusy = false;
mTransmitCount = 0;
mConfig = FooConfig();
mCallback = nullptr; mUserCtx = nullptr;
mTransmitDelayUs = 0; mTransmitDelayForced = false; mShouldFailTransmit = false;
mHistory.clear(); mPendingTransmits = 0;
mSimulatedTimeUs = 0; mFiringCallbacks = false; mDeferredCallbackCount = 0;
}void simulateTransmitComplete(); // Manually complete one pending transmit
void setTransmitFailure(bool should_fail); // Force transmit() to return false
void setTransmitDelay(u32 microseconds); // Set forced delay
const fl::vector<TransmitRecord>& getTransmitHistory() const;
fl::span<const u16> getLastTransmitData() const;
size_t getTransmitCount() const;
bool isEnabled() const;
void clearTransmitHistory();
void reset();Implement IChannelDriver. State machine:
READY → (enqueue) → READY → (show) → BUSY → (poll) → DRAINING → (poll) → READYConstructor pattern:
ChannelDriverFoo(); // Production
ChannelDriverFoo(fl::shared_ptr<IFooPeripheral> peripheral); // TestingChipset grouping: Channels with different timing (T0H, T1H, T0L, T1L) must be transmitted in separate groups. Sort by transmission time.
namespace {
void resetFooMockState() {
auto& mock = FooPeripheralMock::instance();
mock.reset(); // CRITICAL: reset between every test
}
}
FL_TEST_CASE("FooPeripheralMock - basic transmit") {
resetFooMockState();
auto& mock = FooPeripheralMock::instance();
FooConfig config;
config.num_lanes = 4;
config.pclk_hz = 3200000;
FL_REQUIRE(mock.initialize(config));
u16* buffer = mock.allocateBuffer(1024);
FL_REQUIRE(buffer != nullptr);
FL_CHECK(mock.transmit(buffer, 1024));
FL_CHECK(mock.waitDone(100));
FL_CHECK(mock.getTransmitCount() == 1);
mock.freeBuffer(buffer);
}In channel_manager_esp32.cpp.hpp:
u16* allocateBuffer(size_t size_bytes) {
size_t aligned = ((size_bytes + 63) / 64) * 64;
#ifdef FL_IS_WIN
return static_cast<u16*>(_aligned_malloc(aligned, 64));
#else
return static_cast<u16*>(aligned_alloc(64, aligned));
#endif
}
void freeBuffer(u16* buffer) {
if (!buffer) return;
#ifdef FL_IS_WIN
_aligned_free(buffer);
#else
fl::free(buffer);
#endif
}## Hardware Driver Review Results
### File-by-file Analysis
- **src/platforms/esp/32/drivers/spi/channel_engine_spi.cpp.hpp**: [findings]
### Findings by Category
- **DMA Safety**: N issues
- **Interrupt Safety**: N issues
- **Mock Rules**: N issues
- **Timing Constraints**: N issues
### Summary
- Files reviewed: N
- Violations found: N
- Violations fixed: Nagents/docs/cpp-standards.md for general C++ rules© FastLED, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/driver-review of FastLED/FastLED.
Open the folder on GitHubat commit ce225ed
Driver Review next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Driver Review this skillFastLED/FastLED | 7.5k | — | ~3.1k | Automated safety check: Pass | MIT | |
| Authoring VPhone Patch SetsLakr233/vphone-cli | 15k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Sipeed I2C and SPI Hardware Controlsipeed/picoclaw | 30k | — | ~578 | Automated safety check: Pass | MIT | |
| RuView Hardware Setupruvnet/RuView | 97k | — | ~1.8k | Automated safety check: Notes | MIT | |
| Esp32 Firmware Engineeralxv2016/folloup-sticky | 116 | 1 repos | ~3.8k | Automated safety check: Pass | GPL-3.0 | |
| ExecuTorch Binary Size Reductionpytorch/executorch | 5.1k | — | ~793 | Automated safety check: Pass | Custom licence |
Lakr233/vphone-cli
Explains how to declare a firmware patch in a vphone patch set, add a new set, or write a preset, including naming, gating and the checks that catch undeclared patches.
sipeed/picoclaw
Reads and controls I2C and SPI peripherals on Sipeed boards such as LicheeRV Nano, MaixCAM and NanoKVM through the i2c and spi tools.
ruvnet/RuView
Brings a RuView CSI sensing node online by building ESP32-S3 or ESP32-C6 firmware, flashing the board, provisioning WiFi and checking the serial output.
alxv2016/folloup-sticky
ESP32 firmware engineering for ESP-IDF projects. An agent skill from alxv2016/folloup-sticky.
pytorch/executorch
Measures and shrinks the ExecuTorch runtime binary by building a size test, analyzing it with bloaty and landing each reduction as its own pull request.
ruvnet/RuView
Sets up and runs 60 GHz and 24 GHz mmWave radar sensing on ESP32 boards in RuView, alone or fused with WiFi CSI.
FastLED/FastLED
Scan all CI builds and tests, find failures, fetch error logs, and fix the code.
FastLED/FastLED
Firmware crash analysis, stack trace decoder, and register dump interpreter for ESP32/ARM/AVR platforms.
FastLED/FastLED
Parse and classify ESP32 serial log output to identify FastLED-related errors, RMT/I2S/SPI driver faults, timing violations, RTOS issues, and crash signatures.
FastLED/FastLED
Audit embedded code for stack overflow risks, heap fragmentation, static allocation patterns, and memory leaks.
FastLED/FastLED
Guide porting FastLED to new MCU platforms, including int.h types, clockless drivers, SPI implementations, and platform detection.
FastLED/FastLED
Guide Test-Driven Development workflow for FastLED. An agent skill from FastLED/FastLED.
Categories
Review and implement hardware driver code — DMA safety, interrupt correctness, timing constraints, peripheral register usage, channel drivers, and peripheral mock implementations. Driver Review is an agent skill from FastLED/FastLED. Review and implement hardware driver code — DMA safety, interrupt correctness, timing constraints, peripheral register usage, channel drivers, and peripheral mock implementations.
Driver Review fits situations like: reviewing LED drivers; SPI/I2S/RMT/UART/PARLIO/LCDCAM peripherals; GPIO configuration; peripheral mock code.
Run `npx skills add FastLED/FastLED --skill driver-review -a claude-code`. Or copy the skill folder (.claude/skills/driver-review in FastLED/FastLED) into .claude/skills/driver-review in your project. Claude Code loads it when a task matches its description.
Run `npx skills add FastLED/FastLED --skill driver-review -a codex`. Or copy the skill folder (.claude/skills/driver-review in FastLED/FastLED) into .agents/skills/driver-review in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FastLED/FastLED --skill driver-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/driver-review, .gemini/skills/driver-review, .github/skills/driver-review and .opencode/skills/driver-review in your project.
Going by SKILL.md and its folder, Driver Review needs the command-line tools its instructions call (git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Driver Review is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Driver Review: Authoring VPhone Patch Sets (Lakr233/vphone-cli, 15k stars), Sipeed I2C and SPI Hardware Control (sipeed/picoclaw, 30k stars), RuView Hardware Setup (ruvnet/RuView, 97k stars) and Esp32 Firmware Engineer (alxv2016/folloup-sticky, 116 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
FastLED (a GitHub organization) maintains it in FastLED/FastLED, which has 7,505 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 8, 2026.
Source: FastLED/FastLED on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.