fix(workshop): starter prompts must be imperative, not interrogative

Measured on the board 2026-07-20. Same agent, same 708-token prompt,
phrasing the only variable:

  "List the I2C devices on the bus."      -> tool call, answered in 20s
  "What sensors can you find on the bus?" -> no tool call at all, >200s

The first starter prompt shipped as the interrogative form. Teams typing a
question would have watched their board hang for minutes and concluded the
agent was broken. Now imperative, with the measurement recorded next to the
list so nobody "improves" it back into a question.

Also surfaces the asymmetry to students inline: it is a genuine failure mode
of small on-device models, and belongs in their Layer 3 rather than being
hidden.

Separately confirmed the agent does not hallucinate hardware: asked to list
I2C devices on a board with an empty bus, it ran the tool and reported the
bus numbers rather than inventing a sensor.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Omar Sobh
2026-07-20 08:45:03 -07:00
co-authored by Claude Opus 4.8
parent 32750b0d9d
commit e27fad46e2
+14 -1
View File
@@ -19,9 +19,16 @@ interface Entry {
* during their own sensing week, so the agent discovers what is actually on the * during their own sensing week, so the agent discovers what is actually on the
* bus rather than being told. The last one needs no sensor at all, as a fallback * bus rather than being told. The last one needs no sensor at all, as a fallback
* for hardware that will not enumerate. * for hardware that will not enumerate.
*
* KEEP THESE IMPERATIVE. Measured on the board 2026-07-20: the on-board 0.5B
* reliably calls its tools when told to do something ("List the I2C devices on
* the bus." -> tool call, 20s) but stalls without ever calling one when asked a
* question ("What sensors can you find on the I2C bus?" -> no tool call, >200s).
* Same agent, same 708-token prompt; phrasing was the only variable. Anything
* added here should be an instruction, not a question.
*/ */
const EXAMPLE_PROMPTS = [ const EXAMPLE_PROMPTS = [
'What sensors can you find on the I2C bus?', 'List the I2C devices on the bus',
'Read my sensor and print a value once a second', 'Read my sensor and print a value once a second',
'Light the matrix red when the reading crosses a threshold I set', 'Light the matrix red when the reading crosses a threshold I set',
'Scroll GO CLAWS on the LED matrix', 'Scroll GO CLAWS on the LED matrix',
@@ -84,6 +91,12 @@ export function BuildFlash() {
Point the agent at the sensor you already have wired. It finds the device, writes a sketch using Point the agent at the sensor you already have wired. It finds the device, writes a sketch using
its skills, and flashes the MCU — sense, decide, act, on your own hardware. The conversation lives its skills, and flashes the MCU — sense, decide, act, on your own hardware. The conversation lives
in the node; the activity feed streams here. in the node; the activity feed streams here.
<br />
<span className="text-foreground">
Phrase it as an instruction, not a question.
</span>{' '}
“List the I2C devices” works; “what sensors can you find?” tends to stall without ever calling a
tool. That asymmetry is itself a failure mode of small on-device models — worth a line in Layer 3.
</p> </p>
<OpenYourNode variant="inline" className="shrink-0 mt-0.5" /> <OpenYourNode variant="inline" className="shrink-0 mt-0.5" />
</div> </div>