Cover front-loaded aborts and sub-floor budgets in early-abort path
Commit

Two regressions of the early-abort design surfaced in review:
-
When a single front-loaded large blob exhausts the 8 MiB abort floor before any object completes scanning, the observer reports objectsSent == 0 even though totalObjects > 0. The prior calibration and projection paths required objectsSent > 0, so they fell back to the full pack header count for division and to raw sentBytes for sizing — yielding a factor of 2 every retry and reproducing the slow 1→2→4→… convergence this branch is meant to remove. Treat the partially-observed first object as one observation in that case so calibration and projection get a pessimistic-but-bounded per-object estimate.
-
nextSelfImposedBudget can ratchet the budget below the projection-path floor (e.g. to a 5 MiB proxy cutoff), but shouldAbortPush returned false until bytesSent ≥ 8 MiB regardless of budget, so the learned ceiling could never trigger a client-side abort and every retry kept paying for full server-side rejection. Reorder shouldAbortPush so the absolute "we already crossed the threshold" trigger fires first; minBytesBeforeAbort still gates the projection path, which is what it actually existed to suppress.
Entire-Checkpoint: 9c633db8452e