cli.sgit.ai / Guides / sgit-ai 0.24.0 release notes: pack mode

sgit-ai 0.24.0: pack mode

The release notes for 0.24.0, written to be read by a person or handed to an agent. If you do nothing, nothing changes: existing vaults stay normal vaults, and your daily loop (pull, work, commit, push) is the same. What is new is a second kind of vault, a pack vault, which you opt into for a new vault or by converting a copy of an existing one. To start using it, see Pack mode: a playbook for agents.

1. Update and check

$ sgit update          # wraps: pip install --upgrade sgit-ai
$ sgit version
sgit-ai v0.24.0
$ sgit pack --help     # lists import, export, compact, ls, verify, stats

If sgit version shows an older number, you have more than one Python environment. Run python -m pip install --upgrade sgit-ai in the one your harness uses. Existing clones need nothing.

2. What is new: pack vaults

A normal vault stores every object as its own file on the host, so a clone of a long history is thousands of requests. A pack vault stores them as zips:

Files are compressed before they are encrypted, so a text-heavy vault holds about half the bytes on the host. The server is unchanged: pack mode uses the batch, presigned, list and delete routes it already had.

The local store stays one file per object. Packs are unpacked on arrival, each object checked against its content address before it is written. So every local command (history log, cat, diff, branch, stash, vault tag) works exactly as on a normal vault.

CommandWhat it does
sgit init --packs [dir], sgit create --packs <name>A new pack vault.
sgit pack import <normal clone> <new dir>Rewrites a full clone of a normal vault into a new pack vault with its own key. The commits keep their messages and timestamps and are re-signed by the new clone. The source is untouched. The new vault's first sgit push uploads one snapshot. --no-deflate keeps file contents uncompressed; --json prints the stats.
sgit pack export <pack clone> <new dir>The reverse: a new normal vault, nothing packed, nothing compressed.
sgit pack compact [dir] [--dry-run]One snapshot of the current head. The packs it absorbs, the snapshots it supersedes and orphan packs older than a day move to bare/packs/archive/. Each is copied, the copy confirmed by listing, and only then the original deleted; archive/ is never deleted.
sgit pack ls, sgit pack stats, sgit pack verifyWhat the host holds, folder by folder; packs and bytes plus the local compression ratio; every member of every pack checked against its content address. All three take --json.
push, pull, clone, statusUnchanged to use. On a pack vault they move packs.

On the host, a pack vault looks like this:

bare/packs/commits/    <epoch>__<commit id>__<bytes>.zip    one per push
bare/packs/snapshots/  <epoch>__<commit id>__<bytes>.zip    the first push and each compaction
bare/packs/archive/    the same names, moved there by compaction; never deleted
bare/refs/, bare/indexes/, bare/keys/                       exactly as on a normal vault
bare/data/                                                  empty, except tag objects

3. What it measured

Each pair is the same content as a normal vault and as a pack vault, on the same server (dev.send.sgraph.ai), from a cloud sandbox. Medians of three runs unless one number is given.

Normal vaultPack vault
A published vault: 17 commits, 699 files, 2,087 objects (the AIUC-1 conformance vault)
Clone28.6 s8.1 s, 4 requests
First push27.3 s11.8 s
Push of one file10.5 s5.8 s
Pull, 3 pushes behind4.8 s4.2 s
Stored file contents213 MB129 MB (1.66×)
A synthetic vault: 30 commits, 300 prose and JSON files
Clone5.5 s3.3 s, 3 requests
Push of one commit7.3 s5.3 s
Pull, 5 pushes behind5.9 s3.6 s
Stored file contents1.0 MB0.3 MB (3.67×)
The comms vault's history: 1,229 commits, 33,000 objects, measured by the CLI team
Full clone3½ min25 s (18 s of it one 251 MB download in 4 requests)

Re-measured with the 0.24.0 wheel from PyPI after the release, on 22 October: the published vault cloned in 9.0, 9.3 and 9.8 seconds (7.2 s of each was the download, in 4 requests), and imported in about 9 seconds locally. That is within the spread between runs on the same day; the network accounts for it, not the code.

Two things the table does not show:

4. Compatibility

5. Changes every vault gets

6. Security

What the host learns from a pack vault:

A pack cannot write anything a loose object could not:

The feature was reviewed before release in four rounds by cli.sgit.ai's build agent, with tests, a code review and live trials. The rounds found four ways compaction could leave a fresh clone without part of the history (two in the first build, two in the fixes for them), a failed first push that could drop the root commit, a zip-bomb path, a gate that admitted older clients, and smaller issues. Each was fixed with a test. How that went is in Four rounds to no blockers; the reports and the CLI team's answers are under research.

7. Moving an existing vault

You do not convert a vault in place. You make a new pack vault from a full clone of it, and keep the old one:

$ sgit clone <old vault key> old-full            # a full clone: no --path, no --depth
$ sgit pack import old-full new-packs            # prints the NEW vault key: save it
$ cd new-packs && sgit status                    # "This vault has never been pushed"
$ sgit push                                      # one snapshot

8. Known limits

Sources: the CLI's CHANGELOG and its pack-mode feature reference (22 October 2026); the measurements are cli.sgit.ai's live trials of 21 and 22 October 2026 on dev.send.sgraph.ai, except the comms vault's, which are the CLI team's. Every claim in sections 4 and 6 was checked against the code at the merge to main (ab97e497) and on dev at 182cfc16, and the release itself (70b37483, sgit-ai 0.24.0 from PyPI) was run through the playbook's recipes live on dev the evening it was published.

This page as markdown · its source, admin/content/docs/update-to-0-24-0.md