An aggregate is whatever must be consistent in one transaction

The aggregate boundary is not a modelling preference — it is the answer to which invariants have to hold at every instant, and everything else can be eventually consistent.

// inside the aggregate: order total must equal the sum of lines
final class Order
{
    public function addLine(Sku $sku, int $qty, Money $unit): void
    {
        $this->lines[] = new Line($sku, $qty, $unit);
        $this->total  = $this->recalculateTotal();   // always true
    }
}

// outside: stock levels. eventually consistent, via an event.
// forcing that inside makes the transaction span two aggregates.

One transaction per aggregate is the rule that follows, and the moment a use case needs two the design is telling you something — either the boundary is wrong or the second consistency requirement is not really immediate. Referencing other aggregates by identity rather than by object reference is what keeps them separable, and it is the part that feels wrong to anyone used to an ORM navigating relations freely.