The rider-3 sessions ran real git 2.43.0 against the landed machine
over both substrate doors for the first time:
- tests/real_client.rs — the real-client sessions: the
git-daemon-framed duplex door (POC-1's tcp bridge shape, the frame
git-upload-pack <repo>\0host=…\0\0version=2\0) and the POC-3-shape
smart-http stateless door; a real clone, a configured
include-tag-sending fetch, and a transfer.advertiseSid=true client,
per door, with packet-trace assertions. Rows skip quietly when the
git binary is absent.
- Decision (flagged for the wave-5 gate): include-tag accepted and
honored by omission — the token is un-gated in the real V2 client's
send path (transport.c v2.43.0: args.include_tag = followtags;
builtin/fetch.c sets it for every configured fetch) and V2's fetch=
feature list has no slot to advertise or retract it, so the
pre-decision decline demonstrably broke a real configured fetch
(fatal: remote error: fetch: unexpected argument "include-tag");
the pack is the want closure as generated, identical with and
without the token.
- Decision (flagged for the wave-5 gate): session-id= stays declined —
the honest retraction. git's V2 client sends the pre-line only when
the server advertises the session-id capability (fetch-pack.c:
advertise_sid && server_supports_v2("session-id"); captured live) —
the decline is unreachable by a conforming client and accepting it
would be advertising what we don't serve.
- src/fetch.rs — the accepted set grew by one (include_tag, the
FetchArgs field + parse row); the session-id pre-line row pins the
fail-closed decline; the advertisement is unchanged and honest.
- tests/fetch_machines.rs — the accepted-set row + the identical-pack
honor-by-omission row.
- docs/research/git-protocol.md — the fetch-argument inventory
corrected in place: grammar vs traffic (include-tag rides configured
fetches only; the capability pre-lines are exactly agent +
object-format).
- tasks/architecture/oq-19-wire-validations.md — the rider-3 section
records both outcomes with bases.
Verification: cargo test (13 suites), -p alkgit,
-p alkgit-substrate --all-features, --all-features, both clippies
(-D warnings), fmt --check, cargo doc --no-deps, taskgraph validate
— all green; the real-client rows 3× repeat-stable.
alkgit Research Index
Phase 0 (exploration) research. Feeds phase 1 (architecture).
| Doc | Topic | Status |
|---|---|---|
| vision.md | Vision, guiding principles, non-goals, phase-0 checklist | draft v2 (amended 2026-09-21) |
| gitoxide.md | gitoxide (gix) capability + version alignment | initial pass complete |
| alk-stack.md | alk stack fit, integration surface, gitea-lesson constraints | initial pass complete |
| git-protocol.md | Server-side git smart protocol inventory (what we own) | initial pass complete |
| reference-policy.md | Licenses, reference projects, reuse policy | complete |
| pocs.md | POC plan (what to validate before architecture commits) | planned |
| poc-1-findings.md | POC-1: pkt-line over alkcall BiStream (duplex producer) | complete — proceed |
| poc2-findings.md | POC-2: server-side pack generation (streaming pipeline) | complete — proceed |
| poc3-findings.md | POC-3: smart-http shape through alkhttp (stateless substrate) | complete — proceed |
| push-captures.md | Normative receive-pack (push) wire record (real git captures) | complete — ADR-013 basis |
| negotiation-captures.md | Normative V2 negotiation record (real git captures + source) | complete — ADR-014 basis |
| substrate-recomposition.md | Re-baseline on alkstore + alkblobs: registry/object/ref placement, LFS, recomposition POCs (DQ ledger + the ADR-round outcome note) | complete — ADR-019..023 basis |
| pocl-findings.md | POC-L: LFS end-to-end on alkblobs' ops | complete — proceed |
| poco-findings.md | POC-O: alkblobs as the git object store (fetch/ingest/refs) | complete — proceed |
| pocr-findings.md | POC-R: composed registry + reactivity | complete — proceed |
| pocx-findings.md | POC-X: two-node replication on substrate-backed stores (GitSession prototype) | complete — proceed |
Key findings so far
- gitoxide covers storage + pkt-line; the server half of the smart protocol is ours to write (gix-protocol/transport are client-side).
- Published gix 0.87.1 == local clone base; pin crates.io versions.
- alkcall
BiStreamis the natural substrate under pkt-line for both ssh and http paths. - The incompatible-license prior art confirms feasibility but contributes nothing; policy in reference-policy.md.
gixwithdefault-features = falserequires an explicit hash feature; workspace pinssha1with asha256passthrough feature everywhere.
Convergence criteria (phase 0 → phase 1)
Phase 0 is done when POC-1..3 have results and a recommended-approach
summary is written here (append below). Then the Architect produces
docs/architecture/ per sdd_process.
Convergence (2026-09-21): phase 0 gates all pass (POC-1/2/3 proceed).
Phase 1 opened with docs/architecture/; the structural decision is
ADR-010 — pure protocol crate following the alktty/alktunnels template
(the v1 "monorepo + alkgitd binary" framing in these research docs was an
init-agent artifact, amended in vision.md v2). POC-1 maps to the producer
half, POC-2 to the gix backend implementation, POC-3 to the stateless
substrate consumed by alkhttp's future git feature.