                             (log2/exception log-state
                                             ex
                                             ::action-trigger
-                                            "Should have been a variant")]))
+                                            "Should have been a variant"
+                                            {::trigger-details prelog})]))
         ;; TODO: Really should add something like a transaction ID to the state
         ;; to assist in tracing the action
         updater

                             ::scheduling-time scheduling-time
                             ::actual-next actual-next
                             ::now now
                             ::success success})))
        [tag
         log-state] (try [(first success) log-state]
                         (catch IllegalArgumentException ex

        (case tag
          ::specs/child-> (let [[_ callback ack] success]
                            (partial trigger-from-child io-handle callback ack))
          ::drained (fn [{log-state ::log2/state
                          :as state}]
                      ;; Actually, this seems like a strong argument for
                      ;; having a pair of streams. Child could still have
                      ;; bytes to send to the parent after the latter's
                      ;; stopped sending, or vice versa.
                      ;; I'm pretty sure the complexity I haven't finished
                      ;; translating stems from that case.
                      ;; TODO: Another piece to revisit once the basics
                      ;; work.
                      (update state
                              ::log2/state
                              #(log2/warn %
                                          ::action-trigger
                                          "Stream closed. Surely there's more to do"
                                          {::trigger-details prelog})))
          ::parent-> (partial trigger-from-parent
                              io-handle
                              (second success))
          ::no-op identity
          ;; This can throw off the timer, since we're basing the delay on
          ;; the delta from recent (which doesn't change) rather than now.
          ;; But we're basing the actual delay from now, which does change.
          ;; e.g. If the scheduled delay is 980 ms, and someone triggers a
