Index: /trunk/BNC/src/combination/bnccomb.cpp
===================================================================
--- /trunk/BNC/src/combination/bnccomb.cpp	(revision 11058)
+++ /trunk/BNC/src/combination/bnccomb.cpp	(revision 11059)
@@ -963,4 +963,5 @@
     QTextStream out(&_log, QIODevice::WriteOnly);
     processSystem(epoTime, sys, out);
+    out.flush(); // QTextStream buffers: pass the complete log text on
     _buffer.remove(sys);
     if (_logFile) {
@@ -1685,4 +1686,7 @@
   }
 
+  QSet<QString> singleACSats;   // satellites skipped: corrections from < 2 ACs
+  QSet<QString> singleACNames;
+
   while (_running) {
 
@@ -1758,4 +1762,6 @@
       QString  prn  = corr->_prn;
       if      (numCorr[prn] < 2) {
+        singleACSats.insert(prn.mid(0,3));
+        singleACNames.insert(corr->_acName);
         delete corr;
         im.remove();
@@ -1804,4 +1810,21 @@
   }
 
+
+  // Satellites with corrections from fewer than 2 ACs cannot be checked for
+  // orbit outliers and are skipped (e.g. if an AC is missing): log it, in
+  // the combination log every epoch, in the BNC log at most once per hour
+  // -------------------------------------------------------------------------
+  if (!singleACSats.isEmpty()) {
+    QStringList sats = singleACSats.values();  sats.sort();
+    QStringList acs  = singleACNames.values(); acs.sort();
+    QString msg = QString("%1 satellite(s) skipped, corrections from fewer than 2 ACs (only %2): %3")
+                  .arg(sats.size()).arg(acs.join(",")).arg(sats.join(" "));
+    out << epoTime.datestr().c_str() << " " << epoTime.timestr().c_str() << " " << msg << "\n";
+    bncTime& warned = _singleACWarned[sys];
+    if (!warned.valid() || epoTime - warned >= 3600.0) {
+      warned = epoTime;
+      emit newMessage("bncComb: " + QByteArray(1, sys) + " " + msg.toLatin1(), false);
+    }
+  }
   return success;
 }
Index: /trunk/BNC/src/combination/bnccomb.h
===================================================================
--- /trunk/BNC/src/combination/bnccomb.h	(revision 11058)
+++ /trunk/BNC/src/combination/bnccomb.h	(revision 11059)
@@ -269,4 +269,5 @@
   QMap<QString, bncTime>                     _acLastClkTime; // latest correction epoch per AC
   QMap<QString, bncTime>                     _refBiasWarned; // last warning per AC and system
+  QMap<char, bncTime>                        _singleACWarned; // last 'fewer than 2 ACs' message per system
   bool allACsBeyond(const bncTime& epoTime) const;
   bncTime                                    _resTime;
Index: /trunk/BNC/tests/README.md
===================================================================
--- /trunk/BNC/tests/README.md	(revision 11058)
+++ /trunk/BNC/tests/README.md	(revision 11059)
@@ -11,5 +11,5 @@
 ```
 
-Build `./bnc` first (see CLAUDE.md). Each case runs in `tests/work/<case>/`,
+Build `./bnc` first. Each case runs in `tests/work/<case>/`,
 which has an `Input` symlink to `Example_Configs/Input` and an empty `Output`
 directory, so the example configurations run unchanged. On a failure, the
