diff --git a/async/examples/sunsetc.rs b/async/examples/sunsetc.rs
index c3e23f62619d1a790f43faddf5201aeff61f6cd6..b6b4493cfc4c600c5a1786aedd33b85fcda8dd3d 100644
--- a/async/examples/sunsetc.rs
+++ b/async/examples/sunsetc.rs
@@ -51,8 +51,8 @@ fn main() {
 
 async fn run(args: Args) -> Result<()> {
 
-    trace!("tracing main");
-    debug!("verbose main");
+    trace!("tracing sunsetc. args {:?}", args);
+    debug!("verbose sunsetc");
 
     if !args.cmd.is_empty() && args.subsystem.is_some() {
         bail!("can't have '-s subsystem' with a command")
@@ -144,7 +144,7 @@ async fn run(args: Args) -> Result<()> {
     }
 }
 
-#[derive(argh::FromArgs)]
+#[derive(argh::FromArgs, Debug)]
 /** Sunset SSH Client
  */
 struct Args {
diff --git a/src/channel.rs b/src/channel.rs
index 03a2ab107fc2ecd6c5976149efd5ddeb4da8e011..885677c3292f9f03dcecac2275e98189c3894a11 100644
--- a/src/channel.rs
+++ b/src/channel.rs
@@ -168,9 +168,12 @@ impl<C: CliBehaviour, S: ServBehaviour> Channels<C, S> {
         let ch = self.get_mut(num)?;
         let send = ch.send.as_mut().trap()?;
         if data.len() > send.max_packet || data.len() > send.window {
+            trace!("data len {}, max {}, window {}",
+                data.len(), send.max_packet, send.window);
             return Err(Error::bug());
         }
         send.window -= data.len();
+        trace!("send_data: new window {}", send.window);
 
         let data = BinString(data);
         let p = match dt {
@@ -357,6 +360,7 @@ impl<C: CliBehaviour, S: ServBehaviour> Channels<C, S> {
             Packet::ChannelWindowAdjust(p) => {
                 let send = self.get_mut(ChanNum(p.num))?.send.as_mut().trap()?;
                 send.window = send.window.saturating_add(p.adjust as usize);
+                trace!("new window {}", send.window);
             }
             Packet::ChannelData(p) => {
                 self.get(ChanNum(p.num))?;
@@ -801,7 +805,9 @@ impl Channel {
 
     // None on close
     fn send_allowed(&self) -> Option<usize> {
-        self.send.as_ref().map(|s| usize::max(s.window, s.max_packet))
+        let r = self.send.as_ref().map(|s| usize::min(s.window, s.max_packet));
+        trace!("send_allowed {r:?}");
+        r
     }
 
     pub(crate) fn valid_send(&self, _dt: ChanData) -> bool {
diff --git a/src/runner.rs b/src/runner.rs
index 363598d29c795a97ae2c6c127987bf8fb75da78b..2df15bf169e0114fd0778bae5f33c554d5e727f2 100644
--- a/src/runner.rs
+++ b/src/runner.rs
@@ -355,7 +355,9 @@ impl<'a, C: CliBehaviour, S: ServBehaviour> Runner<'a, C, S> {
         let payload_space = self.traf_out.send_allowed(&self.keys);
         // subtract space for packet headers prior to data
         let payload_space = payload_space.saturating_sub(dt.packet_offset());
-        Ok(self.conn.channels.send_allowed(chan.0).map(|s| s.min(payload_space)))
+        let r = Ok(self.conn.channels.send_allowed(chan.0).map(|s| s.min(payload_space)));
+        trace!("ready_channel_send {chan:?} -> {r:?}");
+        r
     }
 
     /// Returns `true` if the channel and `dt` are currently valid for writing.
diff --git a/src/traffic.rs b/src/traffic.rs
index ba4221ec27f08317df81b56bd4b8f93cc6751919..8162cd9fe54ea05ca6f60cc2c3776bdb510bc253 100644
--- a/src/traffic.rs
+++ b/src/traffic.rs
@@ -372,14 +372,16 @@ impl<'a> TrafOut<'a> {
     /// Returns payload space available to send a packet. Returns 0 if not ready or full
     pub fn send_allowed(&self, keys: &KeyState) -> usize {
         // TODO: test for full output buffer
-        match self.state {
+        let r = match self.state {
             TxState::Write { len, .. } => {
                 keys.max_enc_payload(self.buf.len() - len)
             }
             TxState::Idle => {
                 keys.max_enc_payload(self.buf.len())
             }
-        }
+        };
+        trace!("traf send_allowed -> {}", r);
+        r
     }
 
     pub fn send_version(&mut self) -> Result<(), Error> {