Index: trunk/BNC/tests/README.md
===================================================================
--- trunk/BNC/tests/README.md	(revision 11068)
+++ trunk/BNC/tests/README.md	(revision 11069)
@@ -9,4 +9,5 @@
 tests/run_tests.py --list
 tests/run_tests.py --update NAME   # accept current output as new reference
+                                   # (removes references of outputs no longer produced)
 ```
 
@@ -57,7 +58,12 @@
   recordings merged by time (BCEP00BKG0, WTZR00DEU0, FFMJ00DEU0, SSRA00CNE1,
   SSRA00EUH0).
-* Combination (`combi`, `combi_ppp`; 17 and 18) from `data/combi_260930_11min.raw`
-  (SSRA00BKG1, SSRA00CNE1, BCEP00BKG0, FFMJ00DEU0), upload to the caster
-  disabled, SP3/CLK written to files.
+* Combination (`combi`, `combi_ppp`; 17 and 18 unchanged) from
+  `data/combi_261005_11min.raw` (SSRA00BKG1, SSRA00CNE1, SSRA00CHC1, BCEP00BKG0,
+  FFMJ00DEU0), upload to the caster disabled, SP3/CLK/BIA written to files.
+* `combi_multi`: 17 with the 7 ACs of an operational combination (BKG1, CHC1,
+  CNE1, GFZ1, GMV0, NRC0, SHA1; IGS-SSR and RTCM-SSR) from
+  `data/combi_multi_261002_5min.raw`. Covers legacy and erroneous epoch
+  encodings, missing reference-signal biases, inconsistent biases and
+  persistent outliers. The longest case (about 4 min).
 * Upload (`upload_*`; 16, 19, 20) from `data/upload_rtnet_5min.raw` (RTNET engine
   output + BCEP00BKG0): BNC uploads to a local fake caster
@@ -73,4 +79,6 @@
   * `ssr_rtcm_SSRA00CNE0`, `ssr_rtcm_WHU1_OSBC`: RTCM 1059-1270; these test
     whichever class `RTCM3Decoder.cpp` selects for non-4076 SSR.
+* `ssr_qc`: SSR QC report (`ssrQcFile`, 5 min interval) of the 7 AC streams of
+  `data/combi_multi_261002_5min.raw`.
 
 ## Adding a replay case
Index: trunk/BNC/tests/run_tests.py
===================================================================
--- trunk/BNC/tests/run_tests.py	(revision 11068)
+++ trunk/BNC/tests/run_tests.py	(revision 11069)
@@ -39,5 +39,6 @@
   tests/run_tests.py                 run all cases
   tests/run_tests.py ssr_ rinex      run cases whose name contains a pattern
-  tests/run_tests.py --update NAME   (re)generate the reference outputs
+  tests/run_tests.py --update NAME   (re)generate the reference outputs; references of
+                                     outputs no longer produced are removed
   tests/run_tests.py --list
 """
@@ -244,4 +245,5 @@
                 pairs.append((os.path.basename(m), m, spec))
 
+    written = set()
     for ref, path, spec in pairs:
         actual = normalise(read_text(path))
@@ -249,4 +251,5 @@
         if update:
             write_expected(expfile, actual)
+            written.add(os.path.basename(expfile))
             continue
         if not os.path.exists(expfile):
@@ -272,4 +275,9 @@
 
     if update and res.status == "PASS":
+        # references of outputs no longer produced (e.g. a new date in the
+        # file name after a new raw capture) are removed
+        for e in glob.glob(os.path.join(expdir, "*.gz")):
+            if os.path.basename(e) not in written:
+                os.remove(e)
         res.status = "UPDATED"
     return res
Index: trunk/BNC/tests/tools/bncraw.py
===================================================================
--- trunk/BNC/tests/tools/bncraw.py	(revision 11068)
+++ trunk/BNC/tests/tools/bncraw.py	(revision 11069)
@@ -103,5 +103,5 @@
     """Message number; for 4076 return '4076_<subtype>'."""
     if len(payload) < 2:
-        return None
+        return "empty"
     t = (payload[0] << 4) | (payload[1] >> 4)
     if t == 4076 and len(payload) >= 3:
