Concurrent work often finishes in a different order from the order in which you requested it. An aggregator must preserve the input positions while tracking completion separately. A zero-length input needs its own completion path, and one rejection must not leave the returned promise pending.
You will implement a small Promise.all-style helper, propagate the first rejection, collect all settled outcomes, and trace cleanup around an awaited operation. The mocked jobs use real promises without network calls or wall-clock waits. Plain values are valid inputs to the generic aggregator because Promise.resolve normalizes them. Keep return types tied to the input values. The runtime checks inspect ordering and failure labels, while compiler checks verify that aggregation doesn't silently erase the element type.