Performs a full audit of firmware projects to ensure documentation and config match the code.
Install
mkdir -p .claude/skills/project-review && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17386" && unzip -o skill.zip -d .claude/skills/project-review && rm skill.zipInstalls to .claude/skills/project-review
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Comprehensive, whole-project coherence review of the tesla-key-esp32 firmware — finds bugs, inconsistencies, doc/code drift, config/build mismatches, and cross-cutting incoherence so docs, code, config and the build all agree and the project is correct. Use whenever the user asks to "review the project", "project review", audit the repo, "check docs/code for errors/inconsistencies", check that everything is consistent/coherent, or after a batch of changes to make sure nothing drifted. Reach for this even when they don't say "review" — any "is the whole thing still right/coherent?" request fits.Key capabilities
- →Audit project-wide coherence
- →Verify documentation and code synchronization
- →Check build configurations and partition tables
- →Validate runtime invariants
How it works
The agent compares documentation claims against actual code, build configurations, and runtime invariants to identify drift and inconsistencies.
Inputs & outputs
When to use project-review
- →Review firmware project consistency
- →Check documentation and code drift
- →Verify config and build synchronization
About this skill
project-review — holistic coherence audit of tesla-key-esp32
This project is an ESP-IDF 5.x C++ firmware for the ESP32 family — one source tree
builds for esp32 / esp32s3 / esp32c3 / esp32c6 / esp32c5 (the four targets yoziru/tesla-ble
supports, plus esp32c5 via prepare-tesla-ble-c5.sh + the conditional
main/idf_component.yml). All five receive the repository-owned replay-rejection patch in
patches/tesla-ble/ via root CMake. The firmware acts as a BLE↔HTTP proxy for a Tesla
vehicle, API-compatible with TeslaBleHttpProxy,
so it works as an evcc BLE vehicle. It is small but dense with non-local invariants:
a one-line change in code often has to be mirrored in three docs, a Kconfig option, the
partition table, and the web UI — and several rules only bite at runtime (BLE wake
semantics, heap fragmentation, OTA rollback) where a static read won't catch them.
The goal of a review here is not just "find bugs in this file" but coherence: does the documentation describe the code that exists, does a feature appear everywhere it should, do the config/build/version all agree, and do the runtime invariants still hold.
How to run a review
Work in this order — it's what makes the review catch drift rather than just style:
-
Build the intended model from the docs first. Read
.claude/CLAUDE.md(the always-needed essentials: API, command list, NVS table, partition offsets, link-state summary, invariants) anddocs/ARCHITECTURE.md(the deep reference CLAUDE.md points to — telemetry fields, MQTT entities, full sleep/link-state + connection-failure semantics, pairing, OTA detail),README.md,docs/README.md,docs/SECURITY.md. CLAUDE.md anddocs/ARCHITECTURE.mdmust agree with each other and with the code — drift between the slim summary and the deep reference is itself a finding. Note every concrete claim: endpoints, commands, NVS keys, partition offsets, flash size, version, defaults. These are your assertions to check. -
Read the code and find where reality diverges. Walk the components below. For each doc claim, confirm the code matches. For each code feature, confirm the docs cover it. Drift goes both ways — an undocumented endpoint is as much a finding as a documented one that no longer exists.
-
Check config & build agree with both:
sdkconfig.defaults,partitions.csv,main/idf_component.yml(library pin),main/Kconfig.projbuild,version.txt,.github/workflows/build.yml. -
Re-derive the runtime invariants (wake/sleep, heap, OTA, concurrency) from the code — these are listed below and are the easiest things to silently break.
-
Verify before you assert (see Verification discipline). Separate confirmed bugs from hypotheses. Do not over-claim.
-
Audit the review tooling against the project (see Reviewing the skills). The skills (this one and every sibling under
.claude/skills/) and the review subagents under.claude/agents/are part of what drifts — confirm each still maps the project that exists before you trust it, and report any gap as aSKILL-DRIFTfinding (correcting it in the same pass). -
Write the report in the structure at the end.
-
Record the pass in the PR so the gates clear (no file marker). A clean review (no blocking findings) must tick the PR's
/project-reviewcheckbox and stamp it with the reviewed commit — therequire-project-review.shPreToolUse hook refuses every PR merge (gh pr mergeandmcp__github__merge_pull_request) until that box is ticked and its stamped sha still matches the PR head:- [x] `/project-review` clean — merge gate @ <short-sha> # <short-sha> = git rev-parse --short=12 HEADA full review also audits the skills (step 6), and
skill-audit ⊂ project-review, so also tick the sibling/skill-auditbox in the same body to clearrequire-skill-audit.sh(which blocks opening a PR and every push to it). Edit the PR body withgh pr edit <pr> --body-file <file>(or the GitHub MCP update tool in web/remote). Any later commit changes the sha and re-stales both boxes, forcing a fresh review before the next merge. Don't tick either if findings block the merge — fix first.
Use parallel reads/Explore to cover the tree quickly, but reason about the cross-cutting
links yourself — that's where the value is.
Project map (what to read)
| Area | Files | Responsibility |
|---|---|---|
| Boot / wiring | main/main.cpp | WiFi, NVS, SNTP, mDNS, starts every component; boot heap log; OTA mark-valid |
| Target identity | main/platform.hpp | TK_PLATFORM string per CONFIG_IDF_TARGET_*; must agree with /api/proxy/1/version, the HA device model, and esp-web-tools chipFamily |
| Task priorities | main/task_config.hpp | tk::kPrio* — the ONE named-constant table every xTaskCreate site takes its priority from; must agree with the task inventory in docs/ARCHITECTURE.md ("Concurrency") |
| RTOS RAII guards | main/rtos_guard.hpp | tk::SemGuard / MutexGuard / InFlightGuard — the take/give and flag pairs that must survive a throw. Every command_mutex_ / scan_mutex_ acquisition goes through these, so the lock hierarchy in docs/ARCHITECTURE.md ("Concurrency") is only true while they are used; deliberately in tk:: to avoid an ODR clash with a stock MutexGuard |
| BLE GATT client | main/ble_client.{cpp,hpp} | NimBLE central; scans Tesla UUID; RX notify → on_rx_data (runs on the NimBLE host task) |
| Vehicle control | main/vehicle_ctrl.{cpp,hpp} + vehicle_commands.cpp + vehicle_telemetry.cpp + vehicle_pairing.cpp (+ vehicle_ctrl_internal.hpp) | one VehicleController, split by concern: core wiring/link_state() glue; command API; loop_task (active-window polling + sleep gating) + caches; pairing lifecycle/keys |
| HTTP API | main/http_server.{cpp,hpp} + http_api.cpp + http_status.cpp + http_events.cpp + http_ota.cpp + http_config.cpp + http_common.cpp + mcp_server.cpp + command_exec.cpp (+ http_handlers.hpp) | esp_http_server on :80; single catch-all handle_all dispatch (wrapped in try/catch) in http_server.cpp; handlers split by route group; http_events.cpp serves the /events WebSocket live-status push (registered raw/is_websocket, OUTSIDE handle_all — self-guards); mcp_server.cpp serves /mcp (stateless JSON-RPC 2.0 MCP server for AI agents — guide in docs/MCP.md); both command surfaces resolve names/args via logic/command_registry.hpp and execute through command_exec.cpp; /status shaping decided in logic/status_model.hpp (build_status_object() feeds both GET /status and the /events push) |
| HA bridge | main/mqtt_ha.{cpp,hpp} | read-only MQTT discovery publish; its own tasks |
| Storage | main/nvs_storage.{cpp,hpp} | NVS adapter; maps library keys ≤15 chars |
| Diag log | main/diag_log.{cpp,hpp} | in-RAM console ring (GET /diag); static .bss buffer (heap budget!) |
| Syslog | main/syslog.{cpp,hpp} | UDP RFC 5424 forwarder for the captured diag lines; server from NVS syslog_uri / CONFIG_TESLA_SYSLOG_SERVER (POST /set_syslog, empty = disabled); hard/transient send-failure split and the per-line RFC 5424 PRI (facility user, severity from each line's own esp_log level) in the host-tested logic/syslog_policy.hpp |
| OTA | main/ota_update.{cpp,hpp} | pull-based self-update; dual-slot |
| Provisioning | main/provisioning.{cpp,hpp} | captive setup portal when no WiFi |
| Web UI | main/www/ (index.html markup + style.css + app.js, spliced by inline_assets.cmake) | compiled into the app binary as ONE self-contained page; live-updates from the /events WebSocket push (~2 s; WS-only, no interval poll — GET /status is retained only for curl/diagnostics + the post-OTA reboot probe) |
| On-device indicators | main/display.{cpp,hpp} + main/display_font.h (generated by tools/display_sim.py) + main/led_status.{cpp,hpp} | ST7735 status panel (T-Dongle-C5/S3, CONFIG_TESLA_DISPLAY_ENABLED) + underside APA102 status LED (CONFIG_TESLA_LED_ENABLED, default off). Both are thin renderers — cache-only (never wake the car), no MQTT; the "what to show" decisions live in the host-tested logic/display_model.hpp / logic/led_status.hpp, both reading the shared logic/ui_state.hpp snapshot + logic/soc_gradient.hpp ramp. No-op stubs on boards without the hardware |
| Pure logic (host-tested) | main/logic/*.hpp (vin, units, link_state, target, mcp, command_registry, status_model, vehicle_data, command_result, ui_state, display_model, soc_gradient, led_status, syslog_policy, ws_policy, active_window, charge_control, ble_phase, ble_row, ha_templates, http_body, heap_watchdog, connect_outcome) + test/test_logic.cpp | IDF-free logic the device and the host test share (exception: ble_row is a spec header — no firmware TU includes it; its consumer is the browser, held to it by the parity harness): VIN validation, imperial→metric units, the link_state() four-state machine + its /status/MQTT strings, per-target platform/OTA-suffix map, the ONE command registry both /api and /mcp dispatch from (names/kinds/shared arg bounds + tools/list row order) with the MCP JSON-RPC routing/version negotiation, the golden-pinned /status field contract (status_model over the vehicle_data result structs), the shared command result-string mapping, charging-current ACK/readback + active-cache freshness, and the on-device display presenter + status-LED ladder (both off the shared ui_state snapshot + soc_gradient ramp). Host-built + run by scripts/run-mock-tests.sh (CI logic-test gate) — the real local verification
Content truncated.
Prerequisites
Limitations
- →Cannot fix library bugs directly in managed components
- →Requires local ELF file for accurate crash backtrace decoding
How it compares
It performs a holistic cross-cutting audit of the entire project structure instead of checking individual files for style.
Compared to similar skills
project-review side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| project-review (this skill) | 0 | 9d | Review | Advanced |
| deepwiki-rs | 25 | 9mo | Review | Intermediate |
| python-code-style | 9 | 5mo | Review | Intermediate |
| code-review-excellence | 19 | 4mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
deepwiki-rs
sopaco
AI-powered Rust documentation generation engine for comprehensive codebase analysis, C4 architecture diagrams, and automated technical documentation. Use when Claude needs to analyze source code, understand software architecture, generate technical specs, or create professional documentation from any programming language.
python-code-style
wshobson
Python code style, linting, formatting, naming conventions, and documentation standards. Use when writing new code, reviewing style, configuring linters, writing docstrings, or establishing project standards.
code-review-excellence
wshobson
Master effective code review practices to provide constructive feedback, catch bugs early, and foster knowledge sharing while maintaining team morale. Use when reviewing pull requests, establishing review standards, or mentoring developers.
code-walk-thru
pchalasani
Use this when user wants you to walk through (code or text) files in a EDITOR to either explain how some code works, or to show the user what changes you made, etc. You would typically use this repeatedly to show the user your changes or code files one by one, sometimes with specific line-numbers. This way the user is easily able to follow along in their favorite EDITOR as you point at various files possibly at specific line numbers within those files.
cookbook-audit
anthropics
Audit an Anthropic Cookbook notebook based on a rubric. Use whenever a notebook review or audit is requested.
schema-markup
davila7
When the user wants to add, fix, or optimize schema markup and structured data on their site. Also use when the user mentions "schema markup," "structured data," "JSON-LD," "rich snippets," "schema.org," "FAQ schema," "product schema," "review schema," or "breadcrumb schema." For broader SEO issues, see seo-audit.