cli.sgit.ai / Builds / sgit-ai 0.26.6: commit some paths, commit some hunks, push with uncommitted changes

sgit-ai 0.26.6

┌─ sgit-ai 0.26.6 ── dev build ── 28 Oct 2026, 11:47 UTC ─────────────────────────
│ tag v0.26.6 = 036e33b5 (dev) · PyPI package == tag · a plain install gets this
│ new     commit <paths> · commit -p · --list-hunks / --hunk · push when dirty
│ tests   5,144 unit+security ✓ · 18/18 end-to-end ✓ · 100 Git differentials ✓
│ open    BR-1 (high, every build) · BR-2, BR-3 (0.26.5) · R3-1
│ maturity  #######---  good: use it; push at most 100 commits at a time
└──────────────────────────────────────────────────────────────────────────────────
$ pip install sgit-ai==0.26.6        # or: sgit update, which takes the newest build
$ sgit version
sgit-ai v0.26.6

What is new

This build is Git-parity item 2.3, from design 03. With 0.26.5's line merge, it closes the two gaps that mattered most in daily use.

Commit only some paths

$ sgit commit -m "fix the intro" docs/intro.md src/      # only these; everything else stays uncommitted
$ sgit commit "fix the intro" -- docs/intro.md           # the same, message first
$ sgit commit -m "docs" "*.md"                           # * crosses / as in Git
$ sgit commit -m "rm" old.txt --json                     # a deleted file, named, is committed as a deletion

Commit some hunks of a file

$ sgit commit -p                                  # interactive: y n a d s j k q ?   (s splits a hunk)
$ sgit commit --list-hunks --json notes.md        # agents: every hunk with an id
$ sgit commit -m "first fix" --hunk 3f9c… --hunk 81ab…

sgit push with uncommitted changes

A behaviour change for scripts

Compatibility

Review by cli.build

Verdict: good.

┌─ checks on the PyPI package 0.26.6 ───────────────────────────────────────────────
│ ✓ C1  commit <paths> vs `git add -A -- <paths>; git commit`   40 random cases, 0 diff
│ ✓ C2  hunk subsets vs `git apply --cached`, headers vs -U3     60 cases, 0 diff
│ ✓ C3  a stale hunk id is refused; HEAD and objects unchanged
│ ✓ C4  push with an uncommitted edit: commits pushed, edit kept
│ ✓ C5  incoming commit would change an edited file: push refused, edit kept
│ ✓     everything from 0.26.1–0.26.5 (G1–G2, M1–M5, L1–L2, X1–X4) still holds
│ ✓     cross-version with 0.26.0 and 0.26.3, both directions
│ ✗ P1  one push of 150 commits: fresh clone's fsck fails  ── BR-1, below
│ ✗     R3-1 unchanged: 64 bad offsets after compaction of a 0.25.0 vault
└──────────────────────────────────────────────────────────────────────────────────────

BR-1 (high, every build since at least 0.26.0): a push of more than 100 commits leaves a gap on the host

What happens.

one push of N commits, then one more push; a fresh clone walks the history and runs fsck
  ✓ N=100  walks  102 of 102 commits   fsck ok
  ✓ N=101  walks  103 of 103 commits   fsck ok        (100 new + the later push)
  ✗ N=102  walks  101 of 104 commits   fsck: missing 1
  ✗ N=151  walks  101 of 153 commits   fsck: missing 1   (normal and pack vaults alike)

What it breaks:

How likely: an agent that commits often and pushes rarely, a long offline session, or sgit write in a loop.

For the CLI team's agent:

  1. Drop the cap for push. Walk with the commit graph from 0.26.3 (Vault__Commit_Graph), stopping at the remote head's ancestors, with no limit. The stop set is capped at 100 too.
  2. Before moving the ref, check that every uploaded commit's parents are either in the upload set or already on the host.
  3. Give an existing gap a repair path. The pushing clone still holds the commits, so sgit push (or check fsck --repair on that clone) could upload the missing ancestors.
  4. The repro is push_gap.py: python -I push_gap.py 100 101 150, with PACKS=1 for a pack vault.

Also noted

Scripts: check_build.py, push_gap.py, xstep.py. Results: results/check_0.26.6.json, results/suite-v0.26.6.txt. All builds: the builds page.

This page as markdown · its source, admin/content/builds/0-26-6.md