/commission
Phase 2 of AI Closed-Loop Programming — Commissioning: prove the project's OWN never-seen-working parts (its board, its wiring, its peers/simulators), so that a failing test means the code and not the setup. The workbench itself is never commissioned by a project — its quality
$ npx -y skills add SensorsIot/Embedded-AI-Harness --skill commission --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/commission
Context preview
The summary Claude sees to decide when to auto-load this skill.
Phase 2 of AI Closed-Loop Programming — Commissioning: prove the project's OWN never-seen-working parts (its board, its wiring, its peers/simulators), so that a failing test means the code and not the setup. The workbench itself is never commissioned by a project — its quality
SKILL.md
commission.SKILL.mdname: commission
description: >
Phase 2 of AI Closed-Loop Programming — Commissioning: prove the project's
OWN never-seen-working parts (its board, its wiring, its peers/simulators),
so that a failing test means the code and not the setup. The testbench
itself is never commissioned by a project — its quality is depended on, and
fixed in its own repo only when DUT testing disproves it. Use this skill
when the user mentions commissioning, bring-up, a new board or peer, wiring
or polarity doubts, or wants to burn down the debugging agenda. Exit
gate: DUT ready.
Commission — Phase 2 door
A door into the Method skill: **the driver, the chain, and the dispatch map live in `../build/SKILL.md`** — read that first. This door exists so the phase can be entered by its own name; the phase itself is always derived from state. If the debugging agenda is already burned down, say so and continue as `/build` — typing the "wrong" door costs nothing.
The law: no project tests the testbench
**A project depends on the testbench's quality; it never proves it.** The bench is infrastructure, like the compiler — nobody tests gcc before compiling. Its quality is the testbench repo's own responsibility: its FSD, its suite, its acceptance run. A project consumes the bench's declared capabilities at face value, `available: yes` as declared.
**If DUT testing disproves the bench, fix the bench — but only then.** When a red is exonerated of the product by evidence, the bench fault becomes a testbench change request, is fixed at its source, ideally lands as a test in the *testbench's own* suite, and every future project inherits the fix. Attempting to verify the bench upfront — when nothing yet exists that could expose its errors — buys ceremony, not trust. Real work is the only instrument that finds real bench faults.
What commissioning is, under the law
The debugging agenda (`../build/references/test-design.md` §5, first question) lists every **project-side** part that has never been observed doing its job *here* — whatever its reputation elsewhere:
- the DUT board itself — this unit, this slot, first flash, first boot
- project peers and simulators (an M-Bus simulator feeding telegrams)
- project-specific wiring and its polarity
- the project firmware's first contact with each path it uses
Until each is seen working, a failing test measures the environment. The testbench's instruments are **not** on this list.
- Work the agenda top-down; each item names *what proves it*. Drive known
patterns (`0x55` survives inversion detection), make the simulator emit one whole telegram.
- **Agenda items are debugging work, not test cases** — they never enter the
plan. The separator: does it discharge a requirement, or interrogate the setup? Setup measurements go on the **capability**, with their consequence ("two bursts in six arrive clean → assert across several cycles").
- The `unproven` capability state applies to **project-side equipment only** —
bench-declared capabilities are trusted by the law above.
- The bring-up work that *is* a test case (it discharges a requirement about
the device) is `standard` in kind, ordered ahead of the journey.
- The DUT and testbench are not always powered. An unreachable bench is an
unmet precondition — `not done` with the reason, never `failed`.
- **The operator's hands are for physical acts — plug, wire, power, swap.
Observations belong to instruments.** Never design a step where a human reads a measurement by eye. If no instrument can make the observation, that is a testbench change request.
The worked shape — a typical ESP32 project on the testbench
1. **Discover the testbench**; record hostname, last-seen IP and portal version as dated observations. Tests still select by identity — the record is memory, never a hardcoded address. 2. **Find the DUT and verify it is what the project expects** — slot, chip type and revision, flash size, MAC against the FSD's unit. Mismatch = stop: wrong board in the slot. 3. **Project peers**, if any (a meter simulator): present, answers one basic command; record its slot. 4. **Prove the forward path with a trivial known-good program** — CI compiles it, the artifact is flashed to the DUT's slot, and its output is observed. **Print alternating `ON` / `OFF` on serial rather than blinking an LED**: no GPIO need be wired, no camera or eye is required, and the bench observes it directly with a serial pattern match. One pass proves the whole pipeline — toolchain, artifact flow, flash, boot, observation — with code that cannot itself be the problem. When the project's first real build fails later, the pipeline is above suspicion.
Nothing else. Items 1–3 are seconds; item 4 is one CI cycle. Everything beyond this list is bench-side and covered by the law.
Running the four checks
Discover the bench, then hold its URL in `$WB` — never write an address into a committed file.
# 1 · testbench: answers, and in the mode the project needs
curl -s $WB/api/info # hostname, slots configured/running
curl -s $WB/api/wifi/mode # wifi-testing, if the project uses WiFi
# 2 · DUT: the right board, in a free slot
curl -s $WB/api/devices # select by detected_chip, not by label
curl -s -X POST $WB/api/chip/info -H 'Content-Type: application/json' \
-d '{"slot":"<SLOT>"}' # chip, revision, flash size, MAC
# Compare with the unit the FSD records. A mismatch stops the phase.
# Check `debugging` as well as `state`: a live OpenOCD session holds the port
# while the slot still reads idle. Every native-USB ESP32 enumerates as
# 303a:1001, so `detected_chip` is only trustworthy if the bench selects the
# board by USB topology; a bench that does not will confidently report one
# slot's chip for another. Verify the MAC, which is per-board.
# 3 · project peers, if any: present, and answering one basic comRead more
name: commission description: > Phase 2 of AI Closed-Loop Programming — Commissioning: prove the project's OWN never-seen-working parts (its board, its wiring, its peers/simulators), so that a failing test means the code and not the setup. The testbench itself is never commissioned by a project — its quality is depended on, and fixed in its own repo only when DUT testing disproves it. Use this skill when the user mentions commissioning, bring-up, a new board or peer, wiring or polarity doubts, or wants to burn down the debugging agenda. Exit gate: DUT ready.
Commission — Phase 2 door
A door into the Method skill: **the driver, the chain, and the dispatch map live in `../build/SKILL.md`** — read that first. This door exists so the phase can be entered by its own name; the phase itself is always derived from state. If the debugging agenda is already burned down, say so and continue as `/build` — typing the "wrong" door costs nothing.
The law: no project tests the testbench
**A project depends on the testbench's quality; it never proves it.** The bench is infrastructure, like the compiler — nobody tests gcc before compiling. Its quality is the testbench repo's own responsibility: its FSD, its suite, its acceptance run. A project consumes the bench's declared capabilities at face value, `available: yes` as declared.
**If DUT testing disproves the bench, fix the bench — but only then.** When a red is exonerated of the product by evidence, the bench fault becomes a testbench change request, is fixed at its source, ideally lands as a test in the *testbench's own* suite, and every future project inherits the fix. Attempting to verify the bench upfront — when nothing yet exists that could expose its errors — buys ceremony, not trust. Real work is the only instrument that finds real bench faults.
What commissioning is, under the law
The debugging agenda (`../build/references/test-design.md` §5, first question) lists every **project-side** part that has never been observed doing its job *here* — whatever its reputation elsewhere:
- the DUT board itself — this unit, this slot, first flash, first boot
- project peers and simulators (an M-Bus simulator feeding telegrams)
- project-specific wiring and its polarity
- the project firmware's first contact with each path it uses
Until each is seen working, a failing test measures the environment. The testbench's instruments are **not** on this list.
- Work the agenda top-down; each item names *what proves it*. Drive known
patterns (`0x55` survives inversion detection), make the simulator emit one whole telegram.
- **Agenda items are debugging work, not test cases** — they never enter the
plan. The separator: does it discharge a requirement, or interrogate the setup? Setup measurements go on the **capability**, with their consequence ("two bursts in six arrive clean → assert across several cycles").
- The `unproven` capability state applies to **project-side equipment only** —
bench-declared capabilities are trusted by the law above.
- The bring-up work that *is* a test case (it discharges a requirement about
the device) is `standard` in kind, ordered ahead of the journey.
- The DUT and testbench are not always powered. An unreachable bench is an
unmet precondition — `not done` with the reason, never `failed`.
- **The operator's hands are for physical acts — plug, wire, power, swap.
Observations belong to instruments.** Never design a step where a human reads a measurement by eye. If no instrument can make the observation, that is a testbench change request.
The worked shape — a typical ESP32 project on the testbench
1. **Discover the testbench**; record hostname, last-seen IP and portal version as dated observations. Tests still select by identity — the record is memory, never a hardcoded address. 2. **Find the DUT and verify it is what the project expects** — slot, chip type and revision, flash size, MAC against the FSD's unit. Mismatch = stop: wrong board in the slot. 3. **Project peers**, if any (a meter simulator): present, answers one basic command; record its slot. 4. **Prove the forward path with a trivial known-good program** — CI compiles it, the artifact is flashed to the DUT's slot, and its output is observed. **Print alternating `ON` / `OFF` on serial rather than blinking an LED**: no GPIO need be wired, no camera or eye is required, and the bench observes it directly with a serial pattern match. One pass proves the whole pipeline — toolchain, artifact flow, flash, boot, observation — with code that cannot itself be the problem. When the project's first real build fails later, the pipeline is above suspicion.
Nothing else. Items 1–3 are seconds; item 4 is one CI cycle. Everything beyond this list is bench-side and covered by the law.
Running the four checks
Discover the bench, then hold its URL in `$WB` — never write an address into a committed file.
# 1 · testbench: answers, and in the mode the project needs
curl -s $WB/api/info # hostname, slots configured/running
curl -s $WB/api/wifi/mode # wifi-testing, if the project uses WiFi
# 2 · DUT: the right board, in a free slot
curl -s $WB/api/devices # select by detected_chip, not by label
curl -s -X POST $WB/api/chip/info -H 'Content-Type: application/json' \
-d '{"slot":"<SLOT>"}' # chip, revision, flash size, MAC
# Compare with the unit the FSD records. A mismatch stops the phase.
# Check `debugging` as well as `state`: a live OpenOCD session holds the port
# while the slot still reads idle. Every native-USB ESP32 enumerates as
# 303a:1001, so `detected_chip` is only trustworthy if the bench selects the
# board by USB topology; a bench that does not will confidently report one
# slot's chip for another. Verify the MAC, which is per-board.
# 3 · project peers, if any: present, and answering one basic comOther skills on embedded-ai-harness.
- /build
Phase 3 of AI Closed-Loop Programming — the Build phase, and the driver of the whole loop: locate the project on the chain, name the next act, design and declare tests, dispatch code/flash/verify, correct until the tests run clean. Owns the test plan, test design, audit,
Open skill - /define
Phase 0 of AI Closed-Loop Programming — Definition: engineers the WHAT the loop converges on. Writes and evolves the FSD — atomic, falsifiable, provenance-tagged requirements each carrying its verification contract — plus architecture, data model, interface definitions, state
Open skill - /esp-idf-handling
Complete ESP-IDF lifecycle: project setup, build, flash, monitor, and OTA. Automatically detects whether a workbench is available or the device is connected locally via USB. Covers sdkconfig, partition tables, esptool, RFC2217 remote flashing, GPIO download mode, OTA updates,
Open skill - /esp-pio-handling
PlatformIO lifecycle for ESP32 firmware: platformio.ini, environment selection, build, upload and serial monitor, on local USB or through the workbench. Covers what differs from ESP-IDF — the .pio/build layout, the boot_app0 image an Arduino-framework build needs, and RFC2217
Open skill - /grill-me
Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
Open skill - /harness
Phase 1 of AI Closed-Loop Programming — harness the AI for a project: the one-time setup that straps the AI to this particular load so the loop can run. Sequences Definition (via /define) when no FSD exists, then installs the three planes, the testing standard, the test plan
Open skill

