# Recorded `git-lfs-transfer` transcripts
Every byte in these files was produced by **git-lfs 3.7.1** (`GitHub; linux
amd64; go 1.25.0`) talking to `gunnar-lfs` over the pure-SSH transfer, recorded
on 2026-08-03. They are not hand-written and they are not what gunnar
thinks the protocol looks like — they are what the real client actually sent and
what gunnar actually answered, byte for byte, captured by `gunnar-lfs-serve`'s
`GUNNAR_LFS_TRANSCRIPT_DIR` tee as the bytes passed.
`tests/transcript.rs` replays each `client-to-server.bin` through
`Session::serve` and asserts the output equals `server-to-client.bin` exactly.
That guard fires on a machine with no `git-lfs` on it, and it fires on framing
changes that a semantic test would wave through — a stray delim-pkt after a
`quit` status, for instance, which is the one difference that makes the real
client print `unexpected data`.
| `upload.*` | `git lfs push --all origin main`, two objects | `version` → `batch`(`transfer=ssh hash-algo=sha256 refname=…`) → `put-object`+`verify-object` ×2 → `quit` |
| `download.*` | `git lfs fetch --all origin`, the same two objects | `get-object`'s mandatory `size=` argument before the delim, and a `quit` status with **no** delim |
| `lock.*` | the second session `git lfs push` opens | `list-lock` answered `501`, after which the client proceeds and hangs up without `quit` |
The two objects are `gunnar lfs\n` (11 bytes,
`e2e5ffeb6125407ed45479208193c5e438f1554f0da8cee77a0f10b1f99578c6`) and a
68-byte line (`4e73c693de0152ab39b91a62461943231d70eaa78c84ac1e9f196f202c29c53b`).
They are small on purpose: the fixture is committed, and volume is proved
against the live client by `tests/interop.rs` and against process RSS by
`tests/streaming.rs` instead.
## Re-recording
```sh
cargo build -p gunnar-lfs --features fs --bin gunnar-lfs-serve
# a shell script standing in for ssh, dispatching `git-lfs-transfer <path> <op>`
# to `gunnar-lfs-serve <git-dir> <op>` — tests/interop.rs writes exactly one
export GIT_SSH_COMMAND=/path/to/fakessh.sh
export GUNNAR_LFS_TRANSCRIPT_DIR=/somewhere
git lfs push --all origin main
```
The files land as `<pid>.<operation>.{client-to-server,server-to-client}.bin`.
The pid is in the name because `git lfs push --all` opens **two** sessions and
fixed names let the second truncate the first's recording.