glm-5.3-flash 57fbda05ec chore(release): alkgit-substrate 0.1.0
The publish bump (substrate/w10-publish) over the green wave-10 gate:

- manifest: version 0.0.1 -> 0.1.0 (the composition's first publish)
- CHANGELOG: the 0.1.0 entry dated 2026-10-24; the stale
  "manifest reads 0.0.1" note dropped
- fields re-checked (license/repository/description/rust-version 1.88,
  the ADR-025 placement table: sqlite on, lfs on, postgres optional;
  the alkgit pin reads the published 0.1.0); cargo package --list
  shows 32 files — sources, tests, README, the two LICENSE files,
  CHANGELOG; no stray material

Verification: cargo test (workspace), cargo test -p alkgit,
cargo test -p alkgit-substrate, cargo test --all-features, both
clippies (-D warnings), cargo fmt --check, cargo doc --no-deps
(0 warnings), the fuzz corpus gate (13/13), the live-pg harness run
(-p alkgit-substrate --features postgres, 0 skips), and
cargo publish --dry-run --allow-dirty — all green.
2026-10-24 22:21:45 +00:00
2026-10-23 12:29:44 +00:00
2026-10-23 12:29:44 +00:00
2026-10-23 12:29:44 +00:00
2026-10-23 12:29:44 +00:00
2026-10-23 12:29:44 +00:00
2026-10-23 12:29:44 +00:00

alkgit

Git smart protocol for the alk family: the producer and consumer halves of the git smart protocol as a pure protocol crate, riding alkcall channels on the alk/git ALPN.

The crate serves the wire — V2 upload-pack (advertisement, ls-refs, the negotiation ack loop, the done round's streamed pack) and V0 receive-pack (push advertisement, the bounded packless peek, ingestion through the seam, status reports) — and consumes it (GitSession, the typed fetch/push client). It is a pure protocol crate (ADR-010, the alktty/alktunnels template): no binary, no front doors — the alkhttp git/lfs features and alkssh are family infrastructure (doors.md); a downstream app embeds this crate, brings its own door (alkcall duplex or the smart-http shapes), and supplies the backends. The shipped alkstore + alkblobs composition is the separate alkgit-substrate crate (ADR-025).

The backend seam

Everything the wire layer runs through — five #[async_trait], dyn-compatible traits (ADR-018) every backend implements:

Trait Contract
GitRegistry repo id → RepoRecord (ADR-012 §1)
GitRegistryStore registry writes (put/update/remove; grants ride RepoRecord)
GitRefs ref listings + apply_updates — the single CAS home (ADR-013 §7)
GitPackGen pack generation (wants/haves closure) + common_haves (the ack-loop recognition seam, ADR-014 §5)
GitPackIngest push ingestion, the prepare/apply split (PreparedPush) (ADR-020 §2)

Supporting surface: RepoRecord / Visibility / AccessAction + the repo-id grammar, the error model (RegistryError, StorageError), the budget model (Limits — wall clock, request bodies, refs, negotiation rounds, haves, pack and object sizes, the packless peek window, blocking-pool concurrency — ADR-009), and the wire shapes (RefLine, RefUpdate, RefOutcome, PushOptions).

Serving — the producer half

Sessions take the AuthorizedRepo marker by type (ADR-007 — the resolve→authorize check is unskippable; ACL runs before any protocol byte) and are bounded by Limits throughout:

use std::sync::Arc;
use tokio::sync::Semaphore;

use alkgit::{AuthorizedRepo, AccessAction, Limits, Service, serve_duplex};

// the door resolves + authorizes, then hands the marker on:
let marker = AuthorizedRepo::authorize(record, identity, AccessAction::Read)
    .expect("the check passed");

let pipeline = Arc::new(Semaphore::new(limits.max_concurrent_blocking_tasks));
serve_duplex(
    &marker, stream, Limits::default(), Service::UploadPack,
    refs, packgen, ingest, /* push_options_negotiated */ false, pipeline,
).await?;

On the native transport, GitAdapter fronts the alk/git ALPN directly (it holds the same handles and emits the ADR-016 request-line preamble discipline), and register_openable mounts the channels/git/sub open op for channel-mediated sessions. On the smart-http shapes, serve_stateless_post / serve_stateless_advertisement mount the per-POST entry (one POST = one command invocation) the http door composes — see tests/duplex_serving.rs and tests/stateless_serving.rs for full, working assemblies.

Consuming — the consumer half

GitSession is a typed git client over gix-transport's git-daemon Connection on the alkcall BiStream compat halves (ADR-017):

let mut session = GitSession::connect_direct(
    bistream, "owner/repo", Service::UploadPack, Some("peer.alk.dev"), limits,
)?;

let refs = session.ls_refs(&LsRefsArgs::default()).await?;
let reports = session.fetch(
    vec![FetchRound { wants, haves, done: true }],
    &mut pack_sink,
).await?;

Push rides its own session (Service::ReceivePack, the hand-rolled send-pack — commands, the caller's pack streamed raw, the typed PushReport parsed in both framings).

Status

The protocol core is at its first release; the architecture specs (docs/architecture/) are the authoritative contract — the ADRs and transport.md / backend.md pin every wire shape and trait signature the publish froze. The substrate track (waves 6–10) lands the shipped backend composition in alkgit-substrate.

Documentation

License

MIT OR Apache-2.0

S
Description
No description provided
Readme
4.1 MiB
0 Stars 6 Watchers 0 Forks
Languages
Rust 99.4%
Python 0.5%