The board self-tests
You will learn
How the bench checks itself: every script running its own self-test, nothing skipped.
The bench checks itself before it checks your design: 16 spec-named scripts run their own --self-test, 0 bad, and the 8 scripts that have no such flag are listed, not silently skipped -- the difference between 'all good' and 'all we measured'. The widget is that sweep. The lesson's spec is fpga-selftest, the inventory of what a self-test is. A bench that cannot say which of its tools are untested is a bench whose verdicts carry unknown error bars.
Try it
Open the self-test sweep and find the 8 scripts without a flag; then say what listing them, instead of skipping them, buys you.

16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.
specs/tools/trios/tri/fpga-selftest.t27
// SPDX-License-Identifier: Apache-2.0
; specs/tools/trios/tri/fpga-selftest.t27 -- tool gHashTag/BrowserOS:tri/fpga-selftest, the `tri fpga-selftest` command of the trios loop CLI
; Generated by apps/website/scripts/tools-from-trios-tri.mjs from gHashTag/BrowserOS:trios/bin/tri at 7366096248df; do not edit.
; The CLI the loop timers run (`tri drift` holds ~/.local/bin/tri to the tracked copy). It is another program than
; the Rust tri of gHashTag/t27 and the Zig tri of gHashTag/trinity, so the ID is repository-qualified.
; A card is data and carries no test block. ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY
module tool_trios_tri_fpga_selftest;
pub const KIND : str = "tool";
pub const FAMILY : str = "tri-cli";
pub const ID : str = "gHashTag/BrowserOS:tri/fpga-selftest";
pub const REPO : str = "gHashTag/BrowserOS";
pub const QUALIFIED_ID : str = "gHashTag/BrowserOS:tri/fpga-selftest";
pub const SCHEMA : u32 = 2;
pub const COMMAND : str = "tri fpga-selftest";
; The case arm of the dispatcher and the first line of it that does the work.
pub const VARIANT : str = "case arm `fpga-selftest)`, line 1938";
pub const SOURCE : str = "trios/bin/tri";
pub const ENTRY : str = "trios/bin/tri";
pub const SOURCE_COMMIT : str = "7366096248dfb09893e9a7d1a0f1c56ced13d16e";
pub const ROUTED : bool = true;
pub const DISPATCH : str = "exec python3 \"$HOME/skills/ax7203-board-loop/scripts/board.py\" selftest";
pub const DOCUMENTED : bool = true;
pub const HELP_LINE : str = "tri fpga-selftest -- off-board --self-test of every conformance/*.py a .t27 spec names (RUNNER or *_FILE); refuses a self_test that opens a port (exit 2 = fail/missing/refused)";
pub const CATEGORY : str = "AX7203 board (tern_tc: receipts, UART, formats)";
pub const ABOUT : str = "off-board --self-test of every conformance/*.py a .t27 spec names (RUNNER or *_FILE); refuses a self_test that opens a port (exit 2 = fail/missing/refused)";
pub const ABOUT_SOURCE : str = "`tri help` (the heredoc under the help arm of trios/bin/tri)";
pub const ACTIONS : [0]str = [];
pub const ACTIONS_ABOUT : [0]str = [];
pub const ARGS : [0]str = [];
pub const AGENTS : [0]str = [];
pub const AGENTS_NOTE : str = "No source binds an agent letter to this command: the trios CLI is not named by docs/agents/AGENTS_ALPHABET.md or .claude/agents/*.md of gHashTag/t27.";
pub const WHEN_TO_USE : str = "off-board --self-test of every conformance/*.py a .t27 spec names (RUNNER or *_FILE); refuses a self_test that opens a port (exit 2 = fail/missing/refused)";
; public/term/tri-fpga-selftest/meta.json lists 1 run(s) of `tri fpga-selftest`; recorded with the live ~/.local/bin/tri,
; not a build of SOURCE_COMMIT. The site plays it at the end of this card.
pub const CAST : str = "term/tri-fpga-selftest/session.cast";
pub const WITNESS : str = "source-parse";
pub const WITNESS_SOURCE : str = "gHashTag/BrowserOS:trios/bin/tri at 7366096248dfb09893e9a7d1a0f1c56ced13d16e, read as text (the help heredoc and the top-level case arms); the CLI was not run";
pub const ENABLED : bool = true;
All lessons
Module 1 · Why verify
Designs that compile and are wrong, the model that decides, and the plan written before the code.
Module 2 · Testbenches
Stimulus, checks and a verdict, written as one spec beside the design it judges.
Module 3 · Waveforms
A trace of every signal, read the way a hardware engineer reads it, and two runs compared.
Module 4 · Conformance vectors
Cases with the answer written beside them, kept where the compiler can reach them.
Module 5 · Cosimulation
Spec, simulator and board agreeing on the bench Artix-7 XC7A200T, and what to do when they do not.
Module 6 · Coverage
What the tests touched: lines, toggles, states, and what that number hides.
Module 7 · Formal
Assertions that hold every cycle, bounded search for a counterexample, and why a proof needs induction.
Module 8 · Mutation
Break the design on purpose and count what the tests catch.
Module 9 · Sign-off
One command, every receipt, a clean verdict you can show.