Emit typed SSD self-test transition telemetry

ober

e30676a677fb927037489c64c3b14c5a2134fa19

diff --git a/templates/ssd-review-parts/MainActivityInteraction.ss b/templates/ssd-review-parts/MainActivityInteraction.ss
index 96b8407..86458d6 100644
--- a/templates/ssd-review-parts/MainActivityInteraction.ss
+++ b/templates/ssd-review-parts/MainActivityInteraction.ss
@@ -15,6 +15,13 @@
              :
              Unit
              (kotlin-member-call setStatus))
+           (extern
+             (mainInteractionSelfTestLog
+               (activity : MainActivity)
+               (stage : String))
+             :
+             Unit
+             (kotlin-call mainSelfTestLog))
            (def (mainActivityApplySelectMode (activity : MainActivity) (view : SsdReviewView)
                   (ssdAreaMode : Bool) (appendMode : Bool)
                   (enabled : Bool))
@@ -30,7 +37,8 @@
                     (selectModeStatus
                       ssdAreaMode
                       appendMode
-                      (reviewViewSelectMode view)))))
+                      (reviewViewSelectMode view)))
+                  (mainInteractionSelfTestLog activity "mode-changed")))
            (def (mainActivityFinishSelectInteraction
                   (activity : MainActivity)
                   (view : SsdReviewView))
diff --git a/templates/ssd-review-parts/UiTextHelpers.ss b/templates/ssd-review-parts/UiTextHelpers.ss
index 4534f2a..029425b 100644
--- a/templates/ssd-review-parts/UiTextHelpers.ss
+++ b/templates/ssd-review-parts/UiTextHelpers.ss
@@ -1819,6 +1819,18 @@
             Unit
             (kotlin-call mainServerDetectFirst))
           (extern
+            (mainActivitySelfTestLogRaw
+              (activity : MainActivity)
+              (stage : String))
+            :
+            Unit
+            (kotlin-call mainSelfTestLog))
+          (extern
+            (mainActivitySelfTestEnabledRaw (activity : MainActivity))
+            :
+            Bool
+            (kotlin-call mainSelfTestEnabled))
+          (extern
             (mainActivityRestoreServerPdfRaw
               (activity : MainActivity)
               (uri : Uri)
@@ -3152,7 +3164,8 @@
                          (reviewViewPerformHaptic view feedbackConstant)
                          (mainActivitySetStatusRaw
                            activity
-                           (selectedGroupStatus selectedGroup)))))))
+                           (selectedGroupStatus selectedGroup))
+                         (mainActivitySelfTestLogRaw activity "selected"))))))
           (def (mainActivitySelectRequestedGroup
                  (activity : MainActivity)
                  (view : SsdReviewView)
@@ -3345,7 +3358,10 @@
                                view)
                              (mainActivitySetStatusRaw
                                activity
-                               (appendModeStatus appendGroup))))))))
+                               (appendModeStatus appendGroup))
+                             (mainActivitySelfTestLogRaw
+                               activity
+                               "append-started")))))))
           (def (mainActivityStartSsdAreaMode (activity : MainActivity) (view : SsdReviewView)
                  (session : (Nullable SsdSession))
                  (selectedGroupId : (Nullable String))
@@ -3377,7 +3393,8 @@
                    currentGeneration)
                  (mainActivitySetStatusRaw
                    activity
-                   (rotatedPageStatus session))))
+                   (rotatedPageStatus session))
+                 (mainActivitySelfTestLogRaw activity "rotated")))
           (def (mainActivityApproveSelectedGroup (activity : MainActivity) (view : SsdReviewView)
                  (store : TruthStore) (session : (Nullable SsdSession))
                  (selectedGroupId : (Nullable String))
@@ -3408,9 +3425,13 @@
                                (reviewViewPerformHapticAndInvalidate
                                  view
                                  confirmHaptic)
-                               (mainActivitySaveSessionNoAfter activity view store loadedSession
+                               (mainActivitySaveSessionAsync activity view store loadedSession
                                  (approveSavingStatus approvedGroup)
-                                 (approveSavedStatus approvedGroup)))))))))
+                                 (approveSavedStatus approvedGroup)
+                                 (lambda ()
+                                   (mainActivitySelfTestLogRaw
+                                     activity
+                                     "approve-saved"))))))))))
           (def (mainActivitySaveTruth
                  (activity : MainActivity)
                  (view : SsdReviewView)
@@ -3421,10 +3442,12 @@
                (if (sessionMissing session)
                    (begin)
                    (let ([loadedSession (ssdSessionOrEmpty session)])
-                     (mainActivitySaveSessionNoAfter activity view store loadedSession
+                     (mainActivitySaveSessionAsync activity view store loadedSession
                        (saveTruthSavingStatus)
                        (saveTruthSavedStatus
-                         (truthStoreStorageSummary store))))))
+                         (truthStoreStorageSummary store))
+                       (lambda ()
+                         (mainActivitySelfTestLogRaw activity "save-saved"))))))
           (def (mainActivityDeleteGroup (activity : MainActivity) (view : SsdReviewView)
                  (store : TruthStore) (session : SsdSession)
                  (group : SsdGroup) (rejectHaptic : Int32))
@@ -3438,8 +3461,11 @@
                    group)
                  (truthStoreAppendGroupDeleted store session)
                  (reviewViewPerformHapticAndInvalidate view rejectHaptic)
-                 (mainActivitySaveSessionNoAfter activity view store session (deleteSavingStatus group)
-                   (deleteSavedStatus group))))
+                 (mainActivitySaveSessionAsync activity view store session
+                   (deleteSavingStatus group)
+                   (deleteSavedStatus group)
+                   (lambda ()
+                     (mainActivitySelfTestLogRaw activity "delete-saved")))))
           (def (mainActivityDeleteSelectedGroup (activity : MainActivity) (view : SsdReviewView)
                  (store : TruthStore) (session : (Nullable SsdSession))
                  (selectedGroupId : (Nullable String))
@@ -4008,16 +4034,18 @@
                        (mainActivityRunOnUiThreadRaw
                          activity
                          (lambda ()
-                           (begin
-                             (mainActivitySetStatusRaw
-                               activity
-                               (truthSeedMergedStatus
-                                 imported
-                                 (truthStoreStorageSummary store)))
-                             (if (pdfUriLoaded
-                                   (mainActivityPdfUriRaw activity))
-                                 (mainActivityRenderCurrentPage activity)
-                                 (begin)))))
+                           (if (mainActivitySelfTestEnabledRaw activity)
+                               (mainActivitySelfTestLogRaw activity "seed-merged")
+                               (begin
+                                 (mainActivitySetStatusRaw
+                                   activity
+                                   (truthSeedMergedStatus
+                                     imported
+                                     (truthStoreStorageSummary store)))
+                                 (if (pdfUriLoaded
+                                       (mainActivityPdfUriRaw activity))
+                                     (mainActivityRenderCurrentPage activity)
+                                     (begin))))))
                        (begin)))))
           (def (mainActivityHandleAreaSelected (activity : MainActivity) (view : SsdReviewView)
                  (store : TruthStore) (rect : FloatArray)
@@ -6777,7 +6805,10 @@
                                session
                                ", replayed cached truth"))
                            (mainActivityLogDetectResultRaw activity "cached-truth" session "local-truth"
-                             (int32 0) (int32 0))))))
+                             (int32 0) (int32 0))
+                           (mainActivitySelfTestLogRaw
+                             activity
+                             "detect-complete")))))
                  (truthStorePullRemoteTruthCount store session)
                  (begin)))
           (def (finishDetectionWithCells (activity : MainActivity) (store : TruthStore)
@@ -6936,6 +6967,7 @@
                              preparation)
                            learnedGuesses
                            (DetectionPreparation-ocrGuesses preparation))
+                         (mainActivitySelfTestLogRaw activity "detect-complete")
                          (if (shouldMergeRemoteTruthObject
                                existingTruth
                                forceDetect)
@@ -7134,7 +7166,10 @@
                                (mainActivitySaveSessionAsync activity view truthStore session
                                  (editSavingStatus group)
                                  (editSavedStatus group)
-                                 (lambda () (begin))))))))))
+                                 (lambda ()
+                                   (mainActivitySelfTestLogRaw
+                                     activity
+                                     "edit-saved"))))))))))
                  (alertDialogSetNeutralButtonAction
                    dialog
                    (lambda ()