cli.sgit.ai / Builds / sgit-ai 0.26.3: Git-parity phase 0, merges made safe, and dev builds on PyPI
sgit-ai 0.26.3
┌─ sgit-ai 0.26.3 ── dev build ── 28 Oct 2026, 11:02 UTC ─────────────────────────
│ tag v0.26.3 = 16c46e89 (dev) · PyPI package == tag · the first plain X.Y.N
│ fixed commit in a merge · status · equal content · deep forks · nested vault
│ tests 4,921 unit+security ✓ · M1–M5 ✓ · 250-deep fork: 0.26.1 ✗ → 0.26.3 ✓
│ decide BR-4: a plain install now takes dev builds
│ maturity ########-- good
└──────────────────────────────────────────────────────────────────────────────────
What is new
From the Git-parity designs. These fix bugs in today's code and ship before any new feature.
sgit commitduring an unresolved merge used to go ahead as a single-parent commit. Every teammate who pulled received the.conflictcopies. It now refuses, naming each file and the way out:- edit the file and delete its
.conflictcopy; sgit resolve <file> --oursor--theirs;sgit merge-abort.
--amend refuses too.
sgit statusshows a merge in progress: which files are still conflicted, which are resolved, and how to finish or abandon it.- One rule for "an operation is in progress". During a merge with conflicts,
write,vault stash,branch switchandbranch checkoutare refused by name, as Git refuses them. - The same content on both sides is no longer a conflict. Blobs are encrypted with a random IV, so two clones writing the same bytes used to get different ids. Now equal hash and size select the candidates, and the decrypted bytes decide.
- Forks deeper than 200 commits. The merge base and the ahead/behind counts looked at 200 ancestors at most. On a deeper fork a pull merged against an empty base, and a push more than 200 commits ahead was rejected as diverged. A commit graph (Git's paint-down walk) removes the cap.
- A nested vault is never committed. A folder holding its own
.sg_vaultis skipped, as Git skips a nested repository, andstatusnames it (TM-F38). - Atomic object writes (TM-F39).
- Merges,
sgit writeof one file, and sparse commits build only the changed folders. The CLI team measured 3.13 s → 0.13 s on 10,000 files in 10,222 folders. - Dev builds on PyPI as plain versions, and
sgit update --stable. See Which build you get.
Review by cli.build
Verdict: good. Every fix held. The deep-fork fix is real: at 250 commits on each side, 0.26.1 conflicts on every file both sides changed, and this build merges cleanly.
┌─ checks on the PyPI package 0.26.3 ───────────────────────────────────────────────
│ ✓ M1 commit during a merge: refused (Vault__Merge_Unresolved_Error)
│ ✓ M2 status: merge_in_progress, merge_conflicts, merge_markers, …
│ ✓ M3 the same bytes on both sides: no .conflict
│ ✓ M4 fork 250 deep each side, pushed 50 at a time: clean, both changes applied
│ ✓ M5 a clone nested in the working copy: never reaches the vault
│ fork, 250 deep: 0.26.1 ✗ a/x.txt=0, 2 conflicts 0.26.3 ✓ a/x.txt=250
└────────────────────────────────────────────────────────────────────────────────────
The M4 check pushes 50 commits at a time. One push of 250 hits a different bug, which is in every build: BR-1.
BR-4 (decision): a plain pip install sgit-ai now installs dev builds
- What the code does. From this build, dev builds go to PyPI as plain versions, so PyPI's "latest" is the newest dev build: 0.26.6 today.
pip install sgit-aiandsgit updateinstall it, and the CLI's README says so. - The conflict with the stated intent. If the intent is that a plain install gets the release and agents opt in to dev builds, this does the opposite. Every agent that runs
sgit updateis on a dev build an hour after it merges. - The two ways out:
- Keep it. Dev builds are tested before they publish, and a plain install has the newest fixes. State it on every release page, and pin releases with
==X.Y.0orsgit update --stablewhere stability matters. - Make dev builds pre-releases again, as
0.26.1.dev0and0.26.2.dev0were. A plain install then getsX.Y.0, andpip install --pre sgit-aiorsgit update --pregets dev. Pip ignores pre-releases unless asked, so this is the only way PyPI can serve both.
Scripts: check_build.py, deep_fork.py (BATCH=50 python -I deep_fork.py 150 250). All builds: the builds page.
← sgit-ai 0.26.4: commit messages up to 64 KBsgit-ai 0.26.2.dev0: the Git-parity roadmap and seven designs, no code change →
This page as markdown · its source, admin/content/builds/0-26-3.md