CASE
The type case. The sorts you can set on the left, the board on the right, and the pin capability table between them deciding what either one is allowed to do. Choosing a board changes which sorts exist, not just which are greyed out.
The case of sorts
Board profile
Pin map
Dashed = integrated SPI flash, not offered. Dotted = input only, no internal pull. Amber = assigned. Red = conflict.
Pin ledger
Capability table
STICK
The composing stick. Set the program here. Every operation has a keyboard path and the legend is on screen, because a canvas that only answers a mouse is a defect.
Case
Keys
The stick
Selected sort
Retired sorts
Blocks retired by adopting hand written text. Nothing here is deleted.
GALLEY
The proof. This is the program as text and it is a first class view. Fenced regions are generated and tinted by band. Anything outside a fence is yours, is never touched, and is carried through every regeneration exactly as typed.
Regions
Bands
SET generated from blocks and unchanged.
CORRECTED generated then edited by hand inside the fence. The text is authoritative here.
HANDSET written by hand outside any fence. Always authoritative.
IMPORTED arrived from a file and has never been reconciled. Treated as HANDSET until you say otherwise.
Text undo
PROOF
The dry run. The simulator interprets the block model directly and never executes the generated source. Timing is approximate and is not cycle accurate: it is a model of order and rough duration, not of the silicon.
Virtual inputs
Run
ADVERSE mode injects handler runs at the least convenient boundary it can find, which is between a read and the write that follows it. It is a search for races, not a timing model. Every injected run is marked in the log and the timings in that run mean nothing.
Races observed
Event queue
Outputs
Pin trace
Run log
PRESS
The device. Nothing is ever pressed without a deliberate confirmed action. Unknown device responses are reported exactly as received and are never mapped onto an invented error string.
Link
Runtime
Program
Monitor
Watch
FURNITURE
The spacing material. Everything on the board that is not the program.
Device filesystem
Project against device
boot.py and main.py
On a MicroPython board boot.py runs first, once, straight after reset, before the REPL is available. main.py runs next and is where an application belongs. A crash in boot.py is much harder to recover from than a crash in main.py, which is the whole reason to keep them apart.
From v1.4 the project is a set of files rather than one document. A press writes every file in the project and verifies each one, so the file names here are the ones you gave the regions at STICK.
Network credentials
Credentials are written to a separate file, secrets.py, which is excluded from every export by default.
COLOPHON
The imprint. What leaves the instrument, and where it goes in the fleet.
Project
Both projections
Sheets
Bridges to the fleet
The test plan's first cases are the pin conflicts CASE found, because those are the failures that will not announce themselves at runtime.
Debug
DRYDOCK, the optional Arduino build helper
The browser cannot compile the sketch, and it never will. DRYDOCK is a small helper you run on your own machine that shells out to arduino-cli and hands back the build log. It is optional and additive. It is off by default, COMPOSER is fully usable without it, and nothing in any other station depends on it. When it is off, this instrument makes no network call of any kind.
Hosting and installing
COMPOSER is one file and it runs from disk. That is the primary way to use it and nothing here changes it. A browser can only install an app and keep an offline copy when it is served from a secure origin with a manifest and a service worker next to it, and those are separate files, so this instrument writes them for you rather than pretending to be them. Download the kit, put the four files beside composer.html on any static host, and the same file becomes installable.