From 5976b43d04f107efd5beab2baf3f0b2a2d517763 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Fri, 19 Jun 2026 18:09:54 -0400 Subject: [PATCH] Fix exponential memory use when chaining seqgen (#2072) (#2094) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit seqgen.Transform was generating its full sequence on every call, including once per upstream record. When chaining two seqgens of N records each, the second produced N+1 copies of N records in memory (O(N²)) before writing only the first N. Fix: return immediately for non-EOS input; generate the sequence only when the upstream end-of-stream arrives, which is the correct semantics for a verb that discards its input record stream. Co-authored-by: Claude Sonnet 4.6 (1M context) --- pkg/transformers/seqgen.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg/transformers/seqgen.go b/pkg/transformers/seqgen.go index 06e6f3d11..b7a5b0f58 100644 --- a/pkg/transformers/seqgen.go +++ b/pkg/transformers/seqgen.go @@ -183,6 +183,11 @@ func (tr *TransformerSeqgen) Transform( inputDownstreamDoneChannel <-chan bool, outputDownstreamDoneChannel chan<- bool, ) { + if !inrecAndContext.EndOfStream { + // Discard upstream records; generate output only when upstream is done. + return + } + counter := tr.start context := types.NewNilContext() context.UpdateForStartOfFile("seqgen")