# Automated review baseline

Failures are current project defects, not expected-failure marks. Skipped optional tests require the tools listed in tests/README.md.

```text
test_real_main_sketch_compiles_in_isolation (__main__.ArduinoBuild.test_real_main_sketch_compiles_in_isolation) ... ok
test_real_mega_sketch_folder_compiles (__main__.ArduinoBuild.test_real_mega_sketch_folder_compiles) ... FAIL
test_boot_outputs_off (__main__.Firmware.test_boot_outputs_off) ... ok
test_either_closed_door_turns_neopixels_off (__main__.Firmware.test_either_closed_door_turns_neopixels_off) ...
  test_either_closed_door_turns_neopixels_off (__main__.Firmware.test_either_closed_door_turns_neopixels_off) (phase='left_closed') ... FAIL
  test_either_closed_door_turns_neopixels_off (__main__.Firmware.test_either_closed_door_turns_neopixels_off) (phase='right_closed') ... FAIL
test_either_closed_door_turns_rod_leds_off (__main__.Firmware.test_either_closed_door_turns_rod_leds_off) ...
  test_either_closed_door_turns_rod_leds_off (__main__.Firmware.test_either_closed_door_turns_rod_leds_off) (phase='left_closed') ... FAIL
  test_either_closed_door_turns_rod_leds_off (__main__.Firmware.test_either_closed_door_turns_rod_leds_off) (phase='right_closed') ... FAIL
test_pots_at_zero_mute_rod_leds (__main__.Firmware.test_pots_at_zero_mute_rod_leds) ... ok
test_ten_field_telemetry_order_and_crlf (__main__.Firmware.test_ten_field_telemetry_order_and_crlf) ... ok
test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) ...
  test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering1.wav') ... FAIL
  test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering2.wav') ... FAIL
  test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering3.wav') ... FAIL
test_commands_have_path_to_comport (__main__.PatchAndAssets.test_commands_have_path_to_comport) ... FAIL
test_no_unbound_table_playback (__main__.PatchAndAssets.test_no_unbound_table_playback) ... FAIL
test_pd_connections_reference_existing_objects (__main__.PatchAndAssets.test_pd_connections_reference_existing_objects) ... ok
test_selected_tracks_share_frame_length (__main__.PatchAndAssets.test_selected_tracks_share_frame_length) ...
  test_selected_tracks_share_frame_length (__main__.PatchAndAssets.test_selected_tracks_share_frame_length) (song='ohjad') ... FAIL
  test_selected_tracks_share_frame_length (__main__.PatchAndAssets.test_selected_tracks_share_frame_length) (song='tuljak') ... FAIL
test_both_open_frame_emits_one_open_event (__main__.PdRuntime.test_both_open_frame_emits_one_open_event) ... ok
test_song_selection_precedes_playback (__main__.PdRuntime.test_song_selection_precedes_playback) ... FAIL
test_swapping_single_open_door_never_opens_both (__main__.PdRuntime.test_swapping_single_open_door_never_opens_both) ... FAIL
test_every_pot_has_both_supply_rails (__main__.Wiring.test_every_pot_has_both_supply_rails) ...
  test_every_pot_has_both_supply_rails (__main__.Wiring.test_every_pot_has_both_supply_rails) (pot='R5') ... FAIL
  test_every_pot_has_both_supply_rails (__main__.Wiring.test_every_pot_has_both_supply_rails) (pot='R6') ... FAIL
test_neopixel_data_pin_matches_firmware (__main__.Wiring.test_neopixel_data_pin_matches_firmware) ... FAIL
test_no_direct_5v_ground_short (__main__.Wiring.test_no_direct_5v_ground_short) ... ok
test_pot_wiper_pins_match_firmware_channels (__main__.Wiring.test_pot_wiper_pins_match_firmware_channels) ... FAIL
test_sensor_signal_pins_match_firmware (__main__.Wiring.test_sensor_signal_pins_match_firmware) ... FAIL

======================================================================
FAIL: test_real_mega_sketch_folder_compiles (__main__.ArduinoBuild.test_real_mega_sketch_folder_compiles)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 311, in test_real_mega_sketch_folder_compiles
    self.compile()
    ~~~~~~~~~~~~^^
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 308, in compile
    self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1 != 0 :
Used library      Version Path
Adafruit NeoPixel 1.15.5  /private/tmp/tangible-choir-review-tools/arduino-user/libraries/Adafruit_NeoPixel

Used platform Version Path
arduino:avr   1.8.8   /private/tmp/tangible-choir-review-tools/arduino-data/packages/arduino/hardware/avr/1.8.8
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:14:25: error: redefinition of 'Adafruit_NeoPixel pixels'
 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
                         ^
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:9:19: note: 'Adafruit_NeoPixel pixels' previously declared here
 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
                   ^~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:16:11: error: redefinition of 'const int numPots'
 const int numPots = 8;
           ^~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:11:11: note: 'const int numPots' previously defined here
 const int numPots = 8;
           ^~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:17:26: error: redefinition of 'const int potPins [8]'
 const int potPins[numPots] = {A2, A7, A4, A8, A9, A6, A5, A3}; // Adjust pins based on your board and connections
                          ^
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:12:11: note: 'const int potPins [8]' previously defined here
 const int potPins[numPots] = {A2, A7, A4, A8, A9, A6, A5, A3};
           ^~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:20:11: error: redefinition of 'const int numSensors'
 const int numSensors = 2;
           ^~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:14:11: note: 'const int numSensors' previously defined here
 const int numSensors = 2;
           ^~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:21:32: error: redefinition of 'const int sensorPins [2]'
 const int sensorPins[numSensors] = {A0, A1}; // Adjust digital pins as needed
                                ^
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:15:11: note: 'const int sensorPins [2]' previously defined here
 const int sensorPins[numSensors] = {A0, A1};
           ^~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:24:29: error: redefinition of 'const int potLedPins [8]'
 const int potLedPins[numPots] = {5, 4, 3, 11, 2, 10, 12, 13}; // Digital pins for the 8 individual LEDs
                             ^
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:16:11: note: 'const int potLedPins [8]' previously defined here
 const int potLedPins[numPots] = {5, 4, 3, 11, 2, 10, 12, 13};
           ^~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:30:11: error: redefinition of 'const int potThreshold'
 const int potThreshold = 100; // Analog value threshold (0-1023) for LEDs to turn on
           ^~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:21:11: note: 'const int potThreshold' previously defined here
 const int potThreshold = 100;
           ^~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:33:11: error: redefinition of 'const int baudRate'
 const int baudRate = 9600; // Choose a common baud rate
           ^~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:24:11: note: 'const int baudRate' previously defined here
 const int baudRate = 9600;
           ^~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino: In function 'void setup()':
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:36:6: error: redefinition of 'void setup()'
 void setup() {
      ^~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:27:6: note: 'void setup()' previously defined here
 void setup() {
      ^~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino: At global scope:
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:54:8: error: redefinition of 'String receivedString'
 String receivedString;
        ^~~~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:44:8: note: 'String receivedString' previously declared here
 String receivedString;
        ^~~~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:55:5: error: redefinition of 'int secondsValue'
 int secondsValue;
     ^~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:45:5: note: 'int secondsValue' previously declared here
 int secondsValue;
     ^~~~~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:56:9: error: redefinition of 'boolean songEnded'
 boolean songEnded;
         ^~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:46:9: note: 'boolean songEnded' previously declared here
 boolean songEnded;
         ^~~~~~~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino: In function 'void loop()':
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir-mmini.ino:58:6: error: redefinition of 'void loop()'
 void loop() {
      ^~~~
/private/var/folders/fw/p51xwmbx7rzd0gnsd3jsvx6h0000gn/T/choir-avr-tests-vec2vcxw/choir/choir.ino:48:6: note: 'void loop()' previously defined here
 void loop() {
      ^~~~
Error during build: exit status 1


======================================================================
FAIL: test_either_closed_door_turns_neopixels_off (__main__.Firmware.test_either_closed_door_turns_neopixels_off) (phase='left_closed')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 185, in test_either_closed_door_turns_neopixels_off
    self.assertEqual(frames[phase]["lit_pixels"], 0,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     "NeoPixels retain the last open-door frame")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 50 != 0 : NeoPixels retain the last open-door frame

======================================================================
FAIL: test_either_closed_door_turns_neopixels_off (__main__.Firmware.test_either_closed_door_turns_neopixels_off) (phase='right_closed')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 185, in test_either_closed_door_turns_neopixels_off
    self.assertEqual(frames[phase]["lit_pixels"], 0,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     "NeoPixels retain the last open-door frame")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 50 != 0 : NeoPixels retain the last open-door frame

======================================================================
FAIL: test_either_closed_door_turns_rod_leds_off (__main__.Firmware.test_either_closed_door_turns_rod_leds_off) (phase='left_closed')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 177, in test_either_closed_door_turns_rod_leds_off
    self.assertEqual(frames[phase]["leds"], [0] * 8,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     "PWM retains the last open-door brightness")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Lists differ: [255, 255, 255, 255, 255, 255, 255, 255] != [0, 0, 0, 0, 0, 0, 0, 0]

First differing element 0:
255
0

- [255, 255, 255, 255, 255, 255, 255, 255]
+ [0, 0, 0, 0, 0, 0, 0, 0] : PWM retains the last open-door brightness

======================================================================
FAIL: test_either_closed_door_turns_rod_leds_off (__main__.Firmware.test_either_closed_door_turns_rod_leds_off) (phase='right_closed')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 177, in test_either_closed_door_turns_rod_leds_off
    self.assertEqual(frames[phase]["leds"], [0] * 8,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     "PWM retains the last open-door brightness")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Lists differ: [255, 255, 255, 255, 255, 255, 255, 255] != [0, 0, 0, 0, 0, 0, 0, 0]

First differing element 0:
255
0

- [255, 255, 255, 255, 255, 255, 255, 255]
+ [0, 0, 0, 0, 0, 0, 0, 0] : PWM retains the last open-door brightness

======================================================================
FAIL: test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering1.wav')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 266, in test_all_wav_files_have_wave_headers
    self.assertEqual(header[:4], b"RIFF", "A .wav file contains another format")
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: b'ID3\x04' != b'RIFF' : A .wav file contains another format

======================================================================
FAIL: test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering2.wav')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 266, in test_all_wav_files_have_wave_headers
    self.assertEqual(header[:4], b"RIFF", "A .wav file contains another format")
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: b'ID3\x04' != b'RIFF' : A .wav file contains another format

======================================================================
FAIL: test_all_wav_files_have_wave_headers (__main__.PatchAndAssets.test_all_wav_files_have_wave_headers) (asset='assets/audio/cheering3.wav')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 266, in test_all_wav_files_have_wave_headers
    self.assertEqual(header[:4], b"RIFF", "A .wav file contains another format")
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: b'ID3\x04' != b'RIFF' : A .wav file contains another format

======================================================================
FAIL: test_commands_have_path_to_comport (__main__.PatchAndAssets.test_commands_have_path_to_comport)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 258, in test_commands_have_path_to_comport
    self.assertTrue(seen & destinations, objects[start] + " never reaches comport")
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: set() is not true : #X msg 614 323 print len\ 68; never reaches comport

======================================================================
FAIL: test_no_unbound_table_playback (__main__.PatchAndAssets.test_no_unbound_table_playback)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 288, in test_no_unbound_table_playback
    self.assertIn(table, arrays, f"{table} has no array in main.pd")
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'array1' not found in set() : array1 has no array in main.pd

======================================================================
FAIL: test_selected_tracks_share_frame_length (__main__.PatchAndAssets.test_selected_tracks_share_frame_length) (song='ohjad')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 279, in test_selected_tracks_share_frame_length
    self.assertEqual(len(set(lengths.values())), 1,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"{folder}: tracks do not have a common song-end time: {lengths}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 2 != 1 : ohjad: tracks do not have a common song-end time: {'audio/ohjad/alto1plus.wav': (3014524, 44100), 'audio/ohjad/alto2plus.wav': (3014524, 44100), 'audio/ohjad/baritoneplus.wav': (2995866, 44100), 'audio/ohjad/bassplus.wav': (2995866, 44100), 'audio/ohjad/soprano1plus.wav': (3014524, 44100), 'audio/ohjad/soprano2plus.wav': (3014524, 44100), 'audio/ohjad/tenor1plus.wav': (2995866, 44100), 'audio/ohjad/tenor2plus.wav': (2995866, 44100)}

======================================================================
FAIL: test_selected_tracks_share_frame_length (__main__.PatchAndAssets.test_selected_tracks_share_frame_length) (song='tuljak')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 279, in test_selected_tracks_share_frame_length
    self.assertEqual(len(set(lengths.values())), 1,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"{folder}: tracks do not have a common song-end time: {lengths}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 4 != 1 : tuljak: tracks do not have a common song-end time: {'audio/tuljak/alto base track.wav': (3471027, 44100), 'audio/tuljak/bass base track.wav': (3471027, 44100), 'audio/tuljak/men 1.wav': (3602099, 44100), 'audio/tuljak/men 2.wav': (3445482, 44100), 'audio/tuljak/soprano base track.wav': (3471027, 44100), 'audio/tuljak/tenor base track.wav': (3471027, 44100), 'audio/tuljak/women 1.wav': (3602099, 44100), 'audio/tuljak/women 2.wav': (3408898, 44100)}

======================================================================
FAIL: test_song_selection_precedes_playback (__main__.PdRuntime.test_song_selection_precedes_playback)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 397, in test_song_selection_precedes_playback
    self.assertFalse(any(line.startswith("PROBE_LOAD:") for line in events[first_start+1:]),
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     "Track arrays are loaded after playback starts:\n"+"\n".join(events))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: True is not false : Track arrays are loaded after playback starts:
PROBE_LOAD: assets/audio/ohjad/tenor2plus.wav
PROBE_LOAD: assets/audio/ohjad/tenor1plus.wav
PROBE_LOAD: assets/audio/ohjad/soprano2plus.wav
PROBE_LOAD: assets/audio/ohjad/soprano1plus.wav
PROBE_LOAD: assets/audio/ohjad/bassplus.wav
PROBE_LOAD: assets/audio/ohjad/baritoneplus.wav
PROBE_LOAD: assets/audio/ohjad/alto2plus.wav
PROBE_LOAD: assets/audio/ohjad/alto1plus.wav
PROBE_LOAD: assets/audio/rumbleplus.wav
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_LOAD: assets/audio/tuljak/women 2.wav
PROBE_LOAD: assets/audio/tuljak/women 1.wav
PROBE_LOAD: assets/audio/tuljak/tenor base track.wav
PROBE_LOAD: assets/audio/tuljak/soprano base track.wav
PROBE_LOAD: assets/audio/tuljak/men 2.wav
PROBE_LOAD: assets/audio/tuljak/men 1.wav
PROBE_LOAD: assets/audio/tuljak/bass base track.wav
PROBE_LOAD: assets/audio/tuljak/alto base track.wav

======================================================================
FAIL: test_swapping_single_open_door_never_opens_both (__main__.PdRuntime.test_swapping_single_open_door_never_opens_both)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 385, in test_swapping_single_open_door_never_opens_both
    self.assertNotIn("PROBE_DOOR: 1", output,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
                     "Mixed old/new sensor values briefly assert both doors open:\n"+output)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'PROBE_DOOR: 1' unexpectedly found in 'PROBE_LOAD: assets/audio/ohjad/tenor2plus.wav\nPROBE_LOAD: assets/audio/ohjad/tenor1plus.wav\nPROBE_LOAD: assets/audio/ohjad/soprano2plus.wav\nPROBE_LOAD: assets/audio/ohjad/soprano1plus.wav\nPROBE_LOAD: assets/audio/ohjad/bassplus.wav\nPROBE_LOAD: assets/audio/ohjad/baritoneplus.wav\nPROBE_LOAD: assets/audio/ohjad/alto2plus.wav\nPROBE_LOAD: assets/audio/ohjad/alto1plus.wav\nPROBE_LOAD: assets/audio/rumbleplus.wav\nPROBE_DOOR: 1\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_START: bang\nPROBE_LOAD: assets/audio/tuljak/women 2.wav\nPROBE_LOAD: assets/audio/tuljak/women 1.wav\nPROBE_LOAD: assets/audio/tuljak/tenor base track.wav\nPROBE_LOAD: assets/audio/tuljak/soprano base track.wav\nPROBE_LOAD: assets/audio/tuljak/men 2.wav\nPROBE_LOAD: assets/audio/tuljak/men 1.wav\nPROBE_LOAD: assets/audio/tuljak/bass base track.wav\nPROBE_LOAD: assets/audio/tuljak/alto base track.wav\nPROBE_DOOR: 0\n' : Mixed old/new sensor values briefly assert both doors open:
PROBE_LOAD: assets/audio/ohjad/tenor2plus.wav
PROBE_LOAD: assets/audio/ohjad/tenor1plus.wav
PROBE_LOAD: assets/audio/ohjad/soprano2plus.wav
PROBE_LOAD: assets/audio/ohjad/soprano1plus.wav
PROBE_LOAD: assets/audio/ohjad/bassplus.wav
PROBE_LOAD: assets/audio/ohjad/baritoneplus.wav
PROBE_LOAD: assets/audio/ohjad/alto2plus.wav
PROBE_LOAD: assets/audio/ohjad/alto1plus.wav
PROBE_LOAD: assets/audio/rumbleplus.wav
PROBE_DOOR: 1
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_START: bang
PROBE_LOAD: assets/audio/tuljak/women 2.wav
PROBE_LOAD: assets/audio/tuljak/women 1.wav
PROBE_LOAD: assets/audio/tuljak/tenor base track.wav
PROBE_LOAD: assets/audio/tuljak/soprano base track.wav
PROBE_LOAD: assets/audio/tuljak/men 2.wav
PROBE_LOAD: assets/audio/tuljak/men 1.wav
PROBE_LOAD: assets/audio/tuljak/bass base track.wav
PROBE_LOAD: assets/audio/tuljak/alto base track.wav
PROBE_DOOR: 0


======================================================================
FAIL: test_every_pot_has_both_supply_rails (__main__.Wiring.test_every_pot_has_both_supply_rails) (pot='R5')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 209, in test_every_pot_has_both_supply_rails
    self.assertTrue(any(any(p.startswith("GND") for p in r) for r in rails), rails)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: False is not true : [['5V', '5V', '5V', '5V', 'IOREF'], []]

======================================================================
FAIL: test_every_pot_has_both_supply_rails (__main__.Wiring.test_every_pot_has_both_supply_rails) (pot='R6')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 209, in test_every_pot_has_both_supply_rails
    self.assertTrue(any(any(p.startswith("GND") for p in r) for r in rails), rails)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: False is not true : [['5V', '5V', '5V', '5V', 'IOREF'], []]

======================================================================
FAIL: test_neopixel_data_pin_matches_firmware (__main__.Wiring.test_neopixel_data_pin_matches_firmware)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 219, in test_neopixel_data_pin_matches_firmware
    self.assertEqual(actual, ["D" + pin_arrays()["pixelPin"]])
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Lists differ: ['D23'] != ['D6']

First differing element 0:
'D23'
'D6'

- ['D23']
?    ^^

+ ['D6']
?    ^


======================================================================
FAIL: test_pot_wiper_pins_match_firmware_channels (__main__.Wiring.test_pot_wiper_pins_match_firmware_channels)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 224, in test_pot_wiper_pins_match_firmware_channels
    self.assertEqual(actual, set(pin_arrays()["potPins"]))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Items in the first set but not the second:
'A1'
'A0'
Items in the second set but not the first:
'A9'
'A8'

======================================================================
FAIL: test_sensor_signal_pins_match_firmware (__main__.Wiring.test_sensor_signal_pins_match_firmware)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/tobe/slf/slf/tangible-choir/tests/review_tests.py", line 214, in test_sensor_signal_pins_match_firmware
    self.assertEqual(actual, [[pin] for pin in pin_arrays()["sensorPins"]])
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Lists differ: [['A8'], ['A9']] != [['A0'], ['A1']]

First differing element 0:
['A8']
['A0']

- [['A8'], ['A9']]
?     ^       ^

+ [['A0'], ['A1']]
?     ^       ^


----------------------------------------------------------------------
Ran 20 tests in 10.062s

FAILED (failures=19)
```

Source fingerprints:

```text
main.pd: 7d6c3b9fc55de7a632dfb309709c0ed2d371efe012027721986afba3df7e7ca3
arduino.pd: 144a29611c8eb3089da1714622354af0bdacce69b0e24c7ea579407e08e45b7e
soundfile.pd: cc9f7de9e774cf0766cd4147822886b5ccc208311c1024b171ebfded5d055edb
logs.pd: 70b2bca05499fb555806eb3744ce061920c7ff3fc0b1537d0ba11c1e27c0c0a9
choir/choir.ino: d7c2913304de7d30a65ad006614cc7276e16231211eda263f688adb2c4365072
choir/choir-mmini.ino: a94b3ce1c200dc5ee5ba5c1ad068bef0b8a114a245c9de757b66d700124eb422
wiring.fzz: 8c2e792dd22a6776b8eec995dfd8ab12e39ddfd6038674a01fcc4619c9739efc
```

The wiring file was subsequently moved to `docs/Hardware/wiring/wiring.fzz`;
its bytes are unchanged. The fingerprints above retain the baseline paths.
