# sgit-ai 0.26.9: a push of any size uploads every commit (BR-1 fixed), cli.sgit.ai

> Dev build of 28 October 2026, from the CLI's dev at 9345a1fc. Fixes BR-1, the high finding in every build since at least 0.26.0: a push of more than 100 commits uploaded only the newest 100 and left a gap in the host's history. Push now takes every commit the host lacks, refuses before moving the ref if one would be missing, and sgit check upload-history repairs a gap an older build left. Reviewed by cli.build: the repro passes at 101, 102, 150 and 151 commits, loose and pack vaults, and a gap made by 0.26.8 is repaired from the clone that holds the commits. BR-1 closed.

*Source: <https://cli.sgit.ai/builds/0-26-9.html> · generated from the same content as the page, so the two cannot drift.*

---
# sgit-ai 0.26.9

```text
┌─ sgit-ai 0.26.9 ── dev build ── 28 Oct 2026, 16:14 UTC ─────────────────────────
│ tag v0.26.9 = 9345a1fc (dev) · PyPI package == tag
│ fixed   BR-1: one push of 101+ commits uploaded only 100; the host kept a gap
│ new     sgit check upload-history [--dry-run]: repairs a gap an older build left
│ tests   19/19 end-to-end ✓ (P1 now passes) · push_gap 100/101/102/150/151 ✓ · repair ✓
│ maturity  #########-  good: this is the build to push from
└──────────────────────────────────────────────────────────────────────────────────
```

## What changed {#new}

- **Push collects every commit the host lacks,** with the commit graph's two-sided walk, no cap. Before it uploads, it checks that every parent of a pushed commit is pushed too or already on the host, and refuses with a clear error if not.
- **`sgit check upload-history [--dry-run]`** repairs a gap an older build left, **from the clone that still holds the commits**. If that clone is gone, those commits are lost.

## Review by cli.build {#review}

**Verdict: good. BR-1 is closed on this build.**

| Check | Result |
|---|---|
| one push of 100, 101, 102, 150 commits, then one more push; a fresh clone walks the history and runs fsck | 102, 103, 104, 152 commits walked, fsck ok (0.26.8: the clone stops at 101) |
| the same on a pack vault, 151 commits | all walked, fsck ok |
| a gap made by 0.26.8 (150 commits) repaired by `upload-history`, normal and pack vault | 150 objects uploaded; a fresh clone's fsck goes from `missing: 1` to ok |
| the 19 end-to-end checks | all pass, including P1 |

- **Not tested:** a repair when the pushing clone has been deleted (nothing to repair from, by design), and a push of thousands of commits over a slow host.
- **Small:** `--dry-run` reports `uploaded_objects: 0`, so it does not say how many objects a repair would upload.

*Scripts: `push_gap.py`, `gap_repair.py` (new). Results: `results/push_gap_0.26.9_0.26.11.txt`, `results/gap_repair_0.26.8_to_0.26.11.txt`, `results/check_0.26.9.json`. All builds: [the builds page](../builds/index.md).*

---

*[Site index for agents](../llms.txt) · [HTML version](https://cli.sgit.ai/builds/0-26-9.html)*
