--- name: bench-experiment description: Run and record a hardware experiment on the 2C53T bench using a controlled five-step cycle. Use whenever a bench measurement is about to be taken, a hypothesis tested, or a prior result questioned. --- # Bench experiment cycle Every measurement on this project goes through the same five steps, plus two fields that exist because of how this project has actually failed. ## Why the extra fields This project's wrong answers have almost never come from bad hypotheses. They came from **instruments that could not have detected what they claimed to exclude**, and which returned a stable, plausible number anyway. A stable wrong number is indistinguishable from a right one. Documented cases: SSPI status reads at `/2` (garbage, believed for weeks); PB4/MISO floating (every status read taken on a line with no defined idle level); Exp F comparing output LEVELS, which cannot distinguish a pin driven LOW from one left FLOATING, so it "excluded" a class it could not see; a fixed-bin DFT that reported 1.44 where a peak search found 22.8; `fpga scope range 0` silently addressing BOTH channels because the argument is 1-based; `usart tx` queueing into a task that a coldtrace build never creates, so the frames were never transmitted at all. Two rules follow, and they are not optional: 1. **A negative result is worthless until a positive control has been shown to work through the same path, in the same session.** "X produced no signal" means nothing until *something* has produced a signal through that exact instrument. 2. **State what the test cannot see.** If you cannot name a blind spot, you have not understood the instrument. ## The cycle Write one file per experiment in `docs/experiments/`, named `YYYY-MM-DD-NN-short-slug.md`, using `docs/experiments/TEMPLATE.md`. 1. **Problem** — the open question this serves. One sentence, and it must be a question the project actually has, not a restatement of the procedure. 2. **Hypothesis** — a prediction with a *falsifier*: "if H is true we see A; if false we see B." If both outcomes are consistent with the hypothesis, stop and rewrite it. 3. **Procedure** — exact commands, pin states, build flags, signal settings. Include the **preconditions you verified by readback** rather than assumed (register values, `S1:0347`, `CTRL1=0x0000202C`, IDCODE anchor `0x0120681B`). 4. **Control** — the known-good case, run in the same session through the same path. Record its result *first*. If the control fails, the experiment is VOID, not negative, and must be recorded as such. 5. **Results** — raw numbers, not impressions. Screen observations are weak evidence and must be labelled as such. 6. **Blind spots** — what this test could not have detected. 7. **Conclusion** — what is now established, what is excluded, and explicitly what is *not*. Prefer "void" over "negative" when the control did not hold. ## Recording conventions - **Withdraw in place, never delete.** A withdrawn result stays in the file with a `WITHDRAWN : reason` banner. Deleted mistakes get re-made. - **Anchor FPGA measurements**: read IDCODE (`0x11`) at `/256` and confirm `0x0120681B` before trusting any config-port read. - **Never read Gowin STATUS (`0x41`) during capture** — it desynchronises a running configured part and only a true power cycle recovers it. - A **true power cycle** is POWER → "Goodbye" → **unplug USB** → replug. The pinhole reset and a POWER-button shutdown with USB attached both leave the FPGA powered. ## Git workflow - One branch per bench session: `bench/YYYY-MM-DD`. - One commit per completed cycle, message `exp(NN): `, carrying the experiment file plus any firmware change it required. - At session end, write/extend the narrative post in `docs/devlog/` and merge to `main`. The devlog is the story; `docs/experiments/` is the evidence. ## Scale to the question A five-minute register poke does not need a full file — but it does still need the control. If you are about to record a *negative*, or to exclude something, write the file.