lotsa ways to do this, but the most convenient that comes to mind is zl.stream, which implements a FIFO queue.
fifo.maxpat (6.8 KB)
"specify a sequence length " and “outlet per history stage” are mildy sticky requirements when taken together. here, unpack is used to split the queue contents to multiple outlets. if you needed a dynamically sized FIFO, and also needed one outlet per stage in the queue, then i think you would have to allocate the maximum queue size worth of outlets up front. (zl.stream itself is happy to resize the internal FIFO size on the fly.)
as an alternative, you could use things like zl.iter, spray, coll or listfunnel to access the queue elements sequentially or by index, rather than in parallel.
multislider will happily display/edit lists of dyamic size if that is useful.
(a more horrible alternative would be javascripting the creation/destruction of outlets on the fly, yuck.)