diff --git a/lib/gat/handlers/pool/spool/kitchen/chef.go b/lib/gat/handlers/pool/spool/kitchen/chef.go
index 60c70acad6a4bc746d1fa4b808144cb88c3b40fa..c2b7b0cb4ef533d8a29e7a37be341706167981d5 100644
--- a/lib/gat/handlers/pool/spool/kitchen/chef.go
+++ b/lib/gat/handlers/pool/spool/kitchen/chef.go
@@ -88,7 +88,10 @@ func (T *Chef) forget(name string) []*fed.Conn {
 	for conn := range r.conns {
 		conns = append(conns, conn)
 		_ = conn.Close()
+		r.recipe.Free()
+
 		delete(T.byConn, conn)
+		delete(r.conns, conn)
 	}
 
 	T.order = slices.Remove(T.order, r)
@@ -263,6 +266,7 @@ func (T *Chef) Cook() (*fed.Conn, error) {
 		}
 	}
 
+	T.config.Logger.Warn("no available recipes to scale up pool")
 	return nil, ErrNoRecipes
 }
 
diff --git a/lib/gat/handlers/pool/spool/pool.go b/lib/gat/handlers/pool/spool/pool.go
index 3c6569c4fb085aa9ca8e3860d4689006bd402097..fe210a68cc3e86fb97acc96a8f8bc0c1f5778e89 100644
--- a/lib/gat/handlers/pool/spool/pool.go
+++ b/lib/gat/handlers/pool/spool/pool.go
@@ -161,12 +161,15 @@ func (T *Pool) ScaleDown(now time.Time) time.Duration {
 				delete(T.serversByID, s.ID)
 				delete(T.serversByConn, s.Conn)
 			}
-		} else if idle > m {
-			m = idle
+		} else {
+			util := T.config.IdleTimeout - idle
+			if idle < m {
+				m = util
+			}
 		}
 	}
 
-	return T.config.IdleTimeout - m
+	return m
 }
 
 func (T *Pool) ScaleLoop() {