Index: /trunk/BNC/src/bncantex.cpp
===================================================================
--- /trunk/BNC/src/bncantex.cpp	(revision 10947)
+++ /trunk/BNC/src/bncantex.cpp	(revision 10948)
@@ -409,11 +409,34 @@
   if (psiRate > MAX_YAW_RATE) {
     if (!st.valid || (Mjd - st.lastMjd) > MAX_FREEZE_AGE) {
+      if (st.valid) { // i.e. it was the staleness bound, not cold-start
+        _glonassYawLog += QString().asprintf(
+          "%s glonassYaw STALE-RESET  Mjd=%.6f beta=%6.3f mu=%7.2f rate=%6.3f"
+          " old=%7.2f new=%7.2f age=%.1fmin\n",
+          prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI,
+          psiRate*180.0/M_PI, st.yaw*180.0/M_PI, psiNom*180.0/M_PI,
+          (Mjd-st.lastMjd)*1440.0);
+      }
       st.yaw     = psiNom; // no prior history, or it is too old to trust
       st.lastMjd = Mjd;
       st.valid   = true;
     }
+    if (!st.fixed) {
+      _glonassYawLog += QString().asprintf(
+        "%s glonassYaw FIXED-ENTER  Mjd=%.6f beta=%6.3f mu=%7.2f rate=%6.3f yaw=%7.2f\n",
+        prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI,
+        psiRate*180.0/M_PI, st.yaw*180.0/M_PI);
+      st.fixed = true;
+    }
     psiEff = st.yaw;    // hold the frozen yaw angle
   }
   else {
+    if (st.fixed) {
+      _glonassYawLog += QString().asprintf(
+        "%s glonassYaw FIXED-EXIT   Mjd=%.6f beta=%6.3f mu=%7.2f rate=%6.3f"
+        " frozen=%7.2f nominal=%7.2f\n",
+        prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI,
+        psiRate*180.0/M_PI, st.yaw*180.0/M_PI, psiNom*180.0/M_PI);
+      st.fixed = false;
+    }
     st.yaw     = psiNom;
     st.lastMjd = Mjd;
Index: /trunk/BNC/src/bncantex.h
===================================================================
--- /trunk/BNC/src/bncantex.h	(revision 10947)
+++ /trunk/BNC/src/bncantex.h	(revision 10948)
@@ -50,4 +50,13 @@
                            ColumnVector& dx);
 
+  // Drains and returns the diagnostic log accumulated by the GLONASS
+  // yaw-fixed model (mode transitions, with beta/mu/rate at the time).
+  // Empty most of the time; only non-empty right after a transition.
+  QString takeGlonassYawLog() {
+    QString s = _glonassYawLog;
+    _glonassYawLog.clear();
+    return s;
+  }
+
  private:
   // Per-satellite GLONASS yaw state, used to freeze the yaw angle while
@@ -60,9 +69,13 @@
       lastMjd = 0.0;
       valid   = false;
+      fixed   = false;
     }
     double yaw;
     double lastMjd; // Mjd of the last epoch the nominal law was trusted
     bool   valid;
+    bool   fixed;   // true while the yaw-fixed override is currently active
   };
+
+  QString _glonassYawLog;
 
   double glonassYawAngle(const QString& prn, double Mjd, const ColumnVector& xSat,
Index: /trunk/BNC/src/combination/bnccomb.cpp
===================================================================
--- /trunk/BNC/src/combination/bnccomb.cpp	(revision 10947)
+++ /trunk/BNC/src/combination/bnccomb.cpp	(revision 10948)
@@ -1209,4 +1209,5 @@
         _log += "antenna not found " + corr->_prn.mid(0,3).toLatin1() + '\n';
       }
+      _log += _antex->takeGlonassYawLog().toLatin1();
     }
     if (masterIsAPC) {
