diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 29dd7ce..ed55b7b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -68,6 +68,10 @@ jobs:
cmp docs/demo/git-pack-index-v1/verify.txt "$RUNNER_TEMP/pack-verify.txt"
env -u PYTHONHOME -u PYTHONPATH python -B -m git_dag_lab pack-inspect --compact > "$RUNNER_TEMP/pack-inspect.json"
cmp evidence/git-pack-index-v1.json "$RUNNER_TEMP/pack-inspect.json"
+ env -u PYTHONHOME -u PYTHONPATH python -B -m git_dag_lab pack-ofs-verify > "$RUNNER_TEMP/pack-ofs-verify.txt"
+ cmp docs/demo/git-pack-ofs-delta-v1/verify.txt "$RUNNER_TEMP/pack-ofs-verify.txt"
+ env -u PYTHONHOME -u PYTHONPATH python -B -m git_dag_lab pack-ofs-inspect --compact > "$RUNNER_TEMP/pack-ofs-inspect.json"
+ cmp evidence/git-pack-ofs-delta-v1.json "$RUNNER_TEMP/pack-ofs-inspect.json"
- name: Check tests, evidence freshness, and shell boundary
shell: bash
@@ -76,10 +80,12 @@ jobs:
env -u PYTHONHOME -u PYTHONPATH python -W error -m unittest discover -s tests -v
env -u PYTHONHOME -u PYTHONPATH python -B tools/generate_evidence.py --check
env -u PYTHONHOME -u PYTHONPATH python -B tools/generate_pack_evidence.py --check
+ env -u PYTHONHOME -u PYTHONPATH python -B tools/generate_ofs_evidence.py --check
bash -n tools/capture_report.sh
bash -n tools/capture_pack_report.sh
+ bash -n tools/capture_ofs_report.sh
test "$(shellcheck --version | awk '$1 == "version:" {print $2}')" = "0.9.0"
- shellcheck tools/capture_report.sh tools/capture_pack_report.sh
+ shellcheck tools/capture_report.sh tools/capture_pack_report.sh tools/capture_ofs_report.sh
test "$(git status --porcelain=v1 --untracked-files=normal --ignore-submodules=none)" = ""
distribution:
@@ -130,6 +136,11 @@ jobs:
env -u PYTHONHOME -u PYTHONPATH "$runtime/bin/python" -B -m git_dag_lab pack-verify
) > "$RUNNER_TEMP/wheel-pack-verify.txt"
cmp docs/demo/git-pack-index-v1/verify.txt "$RUNNER_TEMP/wheel-pack-verify.txt"
+ (
+ cd "$RUNNER_TEMP"
+ env -u PYTHONHOME -u PYTHONPATH "$runtime/bin/python" -B -m git_dag_lab pack-ofs-verify
+ ) > "$RUNNER_TEMP/wheel-pack-ofs-verify.txt"
+ cmp docs/demo/git-pack-ofs-delta-v1/verify.txt "$RUNNER_TEMP/wheel-pack-ofs-verify.txt"
test "$(git status --porcelain=v1 --untracked-files=normal --ignore-submodules=none)" = ""
- name: Upload verified distributions
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 430e0eb..739a0f1 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -35,12 +35,12 @@ jobs:
persist-credentials: false
- name: Initialize CodeQL
- uses: github/codeql-action/init@c4dd10e44af883a891fe31ced449bcb4a6728b9b # v3.37.6
+ uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
with:
languages: ${{ matrix.language }}
queries: security-extended
- name: Analyze
- uses: github/codeql-action/analyze@c4dd10e44af883a891fe31ced449bcb4a6728b9b # v3.37.6
+ uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
with:
category: /language:${{ matrix.language }}
diff --git a/README.md b/README.md
index 9696591..b8b9c03 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ python3 -m git_dag_lab verify
python3 -m git_dag_lab inspect
python3 -m git_dag_lab pack-verify
python3 -m git_dag_lab pack-inspect
+python3 -m git_dag_lab pack-ofs-verify
+python3 -m git_dag_lab pack-ofs-inspect
python3 -m unittest discover -s tests -v
```
@@ -59,7 +61,21 @@ The verifier does not trust the pack filename or Git's index. It parses the vari

-This is deliberately a closed subset: pack v2 and index v2, at most 64 objects, 1 MiB files, 256 KiB expanded objects, and non-delta entries only. Delta entries (OFS/REF), other object formats, arbitrary repositories, reachability, and pack optimization are not claimed. SHA-1 and CRC32 model Git storage integrity here; neither is presented as authentication, a signature, or collision-resistant security.
+The checked-in production pack evidence remains a deliberately closed non-delta baseline: pack v2 and index v2, at most 64 objects, 1 MiB files, and 256 KiB expanded objects. The parser accepts bounded OFS_DELTA entries with exact earlier-entry bases, depth 4, 4,096 instructions, three-byte offset/size ceilings, and a 16 MiB aggregate expansion budget. REF_DELTA, thin packs, other object formats, arbitrary repositories, reachability, and caller-selected pack optimization remain explicitly unsupported. SHA-1 and CRC32 model Git storage integrity here; neither is presented as authentication, a signature, or collision-resistant security.
+
+### Delta runtime: real OFS bytes
+
+The separate `pack-ofs-*` path stores two fixed 77,824-byte synthetic blobs, changes exactly one numbered record, and asks real `git pack-objects --delta-base-offset` for a depth-one pack. It fails closed unless Git emits exactly one full blob plus one OFS_DELTA, then independently reconstructs both logical objects and cross-checks their physical offsets and CRC32 rows against index v2. Its normalized argv and exact stdin digest are receipt-bound; byte identity is claimed only for repeated runs with the same recorded Git build.
+
+
+
+
Attested 1440×1500 Chromium capture. Provenance: OFS report receipt `8c2b8b07…540b0`; screenshot SHA-256 `2e3a4e81…a3041`. Git 2.54.0 generated one full blob and one OFS_DELTA from two fixed synthetic blobs; zero REF_DELTA, thin-pack, arbitrary-repository, authentication, network, secret, or host-data claims.
+
+
+
+
+
+
## The hard part: verify Git without trusting Git
@@ -88,26 +104,28 @@ See [SECURITY.md](SECURITY.md) for the threat model and trusted-input boundary.
## Evidence pipeline
-Every README visual begins with a canonical production CLI document. The DAG and pack generators each run fresh experiments twice, require byte-identical outputs, derive their SVGs and offline HTML, and bind every artifact into a hash manifest. Digest-pinned Chromium captures both reports in read-only containers with `--network none`. Separate attestations bind each exact report, rendered DOM, PNG, browser binary/version, container digest, isolation policy, viewport, and capture-script hash; without the matching attestation, a generator refuses to call its screenshot verified.
+Every README visual begins with a canonical production CLI document. The DAG, non-delta pack, and OFS generators each run fresh experiments twice, require byte-identical outputs under their recorded runtime, derive their SVGs and offline HTML, and bind every artifact into a hash manifest. Digest-pinned Chromium captures all three reports in read-only containers with `--network none`. Separate attestations bind each exact report, rendered DOM, PNG, browser binary/version, container digest, isolation policy, viewport, and capture-script hash; without the matching attestation, a generator refuses to call its screenshot verified.

### Reproduce the checked-in evidence
```bash
-# Verify both JSON/transcript/visual/report/manifest packages and PNG attestations.
+# Verify all JSON/transcript/visual/report/manifest packages and PNG attestations.
python3 -B tools/generate_evidence.py --check
python3 -B tools/generate_pack_evidence.py --check
+python3 -B tools/generate_ofs_evidence.py --check
-# Rebuild and recapture either offline report with pinned Chromium.
+# Rebuild and recapture any offline report with pinned Chromium.
tools/capture_report.sh
tools/capture_pack_report.sh
+tools/capture_ofs_report.sh
# Run all parser, boundary, CLI, evidence, and provenance tests.
python3 -W error -m unittest discover -s tests -v
```
-Current verified baseline: **90 tests**, **9/9 graph invariants**, **7/7 pack/index checks**, **57 isolated Git invocations** in the DAG evidence run, two independently replayed evidence packages, and two attested offline browser captures.
+Current verified baseline: **113 tests**, **9/9 graph invariants**, **7/7 baseline pack checks**, **12/12 OFS checks**, **57 isolated Git invocations** in the DAG evidence run, three independently replayed evidence packages, and three attested offline browser captures.
| Artifact | What it proves |
|---|---|
@@ -126,13 +144,19 @@ Current verified baseline: **90 tests**, **9/9 graph invariants**, **7/7 pack/in
| [`git-pack-integrity.svg`](docs/assets/git-pack-integrity.svg) | Receipt-derived pack/index checksum and row-binding workflow |
| [`git-pack-report.png`](docs/assets/git-pack-report.png) | Actual Chromium rendering of the pack/index report at 1440×1500 |
| [`git-pack-index-v1/manifest.json`](docs/demo/git-pack-index-v1/manifest.json) | Hash/size/source/command/capture inventory for every pack visual and output |
+| [`evidence/git-pack-ofs-delta-v1.json`](evidence/git-pack-ofs-delta-v1.json) | Canonical real OFS_DELTA receipt, fixed mutation, physical representation, reconstructed logical objects, and non-claims |
+| [`git-pack-ofs-cli.svg`](docs/assets/git-pack-ofs-cli.svg) | Exact production `pack-ofs-verify` stdout rendered as an accessible terminal panel |
+| [`git-pack-ofs-reconstruction.svg`](docs/assets/git-pack-ofs-reconstruction.svg) | Actual OFS distance bytes, base edge, independent reconstruction, OIDs, index offsets, and CRC32 |
+| [`git-pack-ofs-workflow.svg`](docs/assets/git-pack-ofs-workflow.svg) | Fixed inputs, normalized Git argv, recorded Git build, parser, index binding, and receipt |
+| [`git-pack-ofs-report.png`](docs/assets/git-pack-ofs-report.png) | Actual Chromium rendering of the OFS_DELTA report at 1440×1500 |
+| [`git-pack-ofs-delta-v1/manifest.json`](docs/demo/git-pack-ofs-delta-v1/manifest.json) | Hash/size/source/Git-build/command/capture inventory for every OFS visual and output |
## Test coverage by risk
The standard-library suite exercises more than happy-path graph construction:
- independent blob, tree, and commit envelope hashes;
-- pack v2 headers, bounded zlib streams, logical OIDs, trailer checksum, and explicit delta rejection;
+- pack v2 headers, bounded zlib streams, logical OIDs, trailer checksum, bounded OFS_DELTA replay, and explicit REF_DELTA rejection;
- index v2 fanout, sorted OIDs, CRC32 rows, small/large offsets, pack binding, and checksum mutations;
- exact object/ref inventories, parent ordering, reachability, and ancestry;
- Git's special `directory/` tree ordering, truncated binary objects, and malformed headers;
diff --git a/SECURITY.md b/SECURITY.md
index c7474f8..0beebbb 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -19,9 +19,9 @@ Evidence refreshes reject symlinked targets and multi-link files, stage each gen
## Pack/index closed subset
-The pack experiment passes only three fixed synthetic blob IDs to `git pack-objects`; it does not accept a repository path, revision, ref, or caller-provided object list. Generated `.pack` and `.idx` files must be regular, single-link files no larger than 1 MiB and must remain the same inode and size across the bounded read.
+The baseline pack experiment passes only three fixed synthetic blob IDs to `git pack-objects`. The separate OFS experiment passes two fixed 77,824-byte synthetic blob IDs and fixed single-threaded delta options. Neither accepts a repository path, revision, ref, caller-provided object list, or caller-selected optimizer settings. Generated `.pack` and `.idx` files must be regular, single-link files no larger than 1 MiB and must remain the same inode and size across the bounded read.
-The independent parser accepts pack v2 and index v2 only. It rejects OFS/REF deltas, more than 64 objects, objects expanding beyond 256 KiB, invalid or unterminated zlib streams, duplicate logical objects, non-canonical fanout/large-offset tables, and any mismatch among logical object IDs, CRC32 rows, offsets, pack trailer, index pack binding, or index checksum. These checks establish the fixed fixture's storage integrity; they do not establish provenance, authenticity, repository reachability, or safety of arbitrary Git data.
+The independent parser accepts pack v2 and index v2 with logical commit, tree, and blob entries only; tag entries are outside this closed subset. Its bounded OFS_DELTA subset requires an exact earlier pack-entry base, canonical biased offsets and size headers, no more than depth 4 or 4,096 instructions, at most three bytes for bounded offsets and sizes, at most 256 KiB per object or delta program, and at most 16 MiB of aggregate expanded output. It rejects REF_DELTA and thin packs, more than 64 objects, invalid or unterminated zlib streams, duplicate logical objects, non-canonical fanout/large-offset tables, and any mismatch among logical object IDs, CRC32 rows, offsets, pack trailer, index pack binding, or index checksum. The OFS runtime additionally requires exactly one full blob, one depth-one OFS entry, an exact re-encoding of the observed biased distance, and a complete fixed logical inventory. Its report records normalized pack arguments and an exact stdin digest; output bytes are only expected to repeat under the same Git build. These checks establish bounded fixture storage integrity; they do not establish provenance, authenticity, repository reachability, collision resistance, or safety of arbitrary Git data.
## SHA-1 scope
diff --git a/docs/assets/git-pack-ofs-cli.svg b/docs/assets/git-pack-ofs-cli.svg
new file mode 100644
index 0000000..a67e0cf
--- /dev/null
+++ b/docs/assets/git-pack-ofs-cli.svg
@@ -0,0 +1,29 @@
+
diff --git a/docs/assets/git-pack-ofs-reconstruction.svg b/docs/assets/git-pack-ofs-reconstruction.svg
new file mode 100644
index 0000000..1bc4177
--- /dev/null
+++ b/docs/assets/git-pack-ofs-reconstruction.svg
@@ -0,0 +1,41 @@
+
diff --git a/docs/assets/git-pack-ofs-report.png b/docs/assets/git-pack-ofs-report.png
new file mode 100644
index 0000000..ff7fe72
Binary files /dev/null and b/docs/assets/git-pack-ofs-report.png differ
diff --git a/docs/assets/git-pack-ofs-workflow.svg b/docs/assets/git-pack-ofs-workflow.svg
new file mode 100644
index 0000000..da6bbff
--- /dev/null
+++ b/docs/assets/git-pack-ofs-workflow.svg
@@ -0,0 +1,56 @@
+
diff --git a/docs/demo/git-dag-v1/manifest.json b/docs/demo/git-dag-v1/manifest.json
index d8492cf..defb3d9 100644
--- a/docs/demo/git-dag-v1/manifest.json
+++ b/docs/demo/git-dag-v1/manifest.json
@@ -135,8 +135,8 @@
},
{
"path": "git_dag_lab/cli.py",
- "sha256": "03648331670cdc350fd486b2939e4914e90ee7ca7c2ea2b5cabd4eced21fe766",
- "size": 2335
+ "sha256": "e634feb9a908e3b0f46e1011c64667000b9e43ceb6ce1233b9fda1ce166a35ac",
+ "size": 2972
},
{
"path": "tools/generate_evidence.py",
diff --git a/docs/demo/git-pack-index-v1/manifest.json b/docs/demo/git-pack-index-v1/manifest.json
index 60ec3f1..c61735c 100644
--- a/docs/demo/git-pack-index-v1/manifest.json
+++ b/docs/demo/git-pack-index-v1/manifest.json
@@ -130,13 +130,13 @@
"sources": [
{
"path": "git_dag_lab/pack.py",
- "sha256": "d3882af57ad9b3d85580032b7e5ceccd2c8b443fbee7be30c7452a31aee3f8a8",
- "size": 20802
+ "sha256": "b2b7061751f09997673b09a235e5257c8a2e93de82ad523703aa1bc015d4c765",
+ "size": 39441
},
{
"path": "git_dag_lab/cli.py",
- "sha256": "03648331670cdc350fd486b2939e4914e90ee7ca7c2ea2b5cabd4eced21fe766",
- "size": 2335
+ "sha256": "e634feb9a908e3b0f46e1011c64667000b9e43ceb6ce1233b9fda1ce166a35ac",
+ "size": 2972
},
{
"path": "tools/generate_evidence.py",
diff --git a/docs/demo/git-pack-ofs-delta-v1/capture-attestation.json b/docs/demo/git-pack-ofs-delta-v1/capture-attestation.json
new file mode 100644
index 0000000..ed5a6fe
--- /dev/null
+++ b/docs/demo/git-pack-ofs-delta-v1/capture-attestation.json
@@ -0,0 +1,60 @@
+{
+ "attestation": {
+ "browser": {
+ "binary_path": "/ms-playwright/chromium_headless_shell-1193/chrome-linux/headless_shell",
+ "sha256": "003728e0b77eb9d52e4d258594bd55ce22ecd245eb6d3b6858fbd844c901ad7d",
+ "version": "Chromium 140.0.7339.186"
+ },
+ "container": {
+ "architecture": "amd64",
+ "image": "mcr.microsoft.com/playwright@sha256:2f29369043d81d6d69a815ceb80760f55e85f5020371ad06a4d996f18503ad1c"
+ },
+ "input": {
+ "report": {
+ "path": "docs/demo/git-pack-ofs-delta-v1/report.html",
+ "report_receipt_sha256": "8c2b8b07e9ab48492e9de13167c86eaf8835adcceecdcff958a6080a7ae540b0",
+ "sha256": "ac67aa531f616b148df847a92e3a228063ea9591338054b247118f4065d7b486",
+ "size": 6288
+ }
+ },
+ "isolation": {
+ "capabilities": "all-dropped",
+ "demo_mount": "read-only",
+ "network": "none",
+ "no_new_privileges": true,
+ "pull": "never",
+ "root_filesystem": "read-only",
+ "user": "caller-nonroot"
+ },
+ "outputs": {
+ "rendered_dom": {
+ "path": "docs/demo/git-pack-ofs-delta-v1/rendered-dom.html",
+ "sha256": "acf985e2f5a5d68ef02ecad57dcbf9493f8bcd5b2aa36dfac1a39dd5b748e0d5",
+ "size": 6288
+ },
+ "screenshot": {
+ "height": 1500,
+ "path": "docs/assets/git-pack-ofs-report.png",
+ "sha256": "2e3a4e813cebf28a18d60bc65d9d3eb5d5426b2e702ac36a560a7c52465a3041",
+ "size": 598564,
+ "width": 1440
+ }
+ },
+ "schema_version": "git-pack-ofs-browser-capture-attestation/v1",
+ "script": {
+ "path": "tools/capture_ofs_report.sh",
+ "sha256": "638de7acced052805c52e2bb85de3dd1697a61254595299111f8ab6fea3afae1",
+ "size": 11144
+ },
+ "viewport": {
+ "device_scale_factor": 1,
+ "height": 1500,
+ "width": 1440
+ }
+ },
+ "receipt": {
+ "algorithm": "sha256",
+ "canonicalization": "UTF-8 JSON; sorted keys; compact separators",
+ "sha256": "5891c29f10f3f5bddd736aae13829a16c4899a6cda2c47952d190025342c31b9"
+ }
+}
diff --git a/docs/demo/git-pack-ofs-delta-v1/inspect.json b/docs/demo/git-pack-ofs-delta-v1/inspect.json
new file mode 100644
index 0000000..bfc2e5f
--- /dev/null
+++ b/docs/demo/git-pack-ofs-delta-v1/inspect.json
@@ -0,0 +1,151 @@
+{
+ "receipt": {
+ "algorithm": "sha256",
+ "canonicalization": "UTF-8 JSON; sorted keys; compact separators",
+ "sha256": "8c2b8b07e9ab48492e9de13167c86eaf8835adcceecdcff958a6080a7ae540b0"
+ },
+ "report": {
+ "checks": {
+ "all_fixture_objects_present": true,
+ "exactly_one_full_entry": true,
+ "exactly_one_ofs_delta_entry": true,
+ "index_checksum_verified": true,
+ "index_crc32_matches_pack": true,
+ "index_fanout_matches_sorted_oids": true,
+ "index_offsets_match_pack": true,
+ "ofs_base_entry_bound": true,
+ "ofs_distance_reencoded": true,
+ "pack_trailer_verified": true,
+ "reconstructed_objects_match_fixture": true,
+ "ref_delta_entries_absent": true
+ },
+ "command_trace": [
+ "init",
+ "hash-object",
+ "hash-object",
+ "pack-objects"
+ ],
+ "fixture": {
+ "changed_record": {
+ "after": "1024:fedcba9876543210fedcba9876543210",
+ "before": "1024:0123456789abcdef0123456789abcdef",
+ "line_number": 1024
+ },
+ "object_count": 2,
+ "objects": [
+ {
+ "label": "baseline",
+ "oid": "d2e8559ccc7b0bcfd193b7e9ad0b9d59982eb7c6",
+ "payload_sha256": "ea612ce3c3fb55f7a05ceecf1bcbf0ecf62fe298a8e387011e21f0d3d6353f1a",
+ "size": 77824
+ },
+ {
+ "label": "line-1024-changed",
+ "oid": "586c379527cbf256bb8dc7558e808ae5150a8959",
+ "payload_sha256": "e6bd970352e9ed0dc5389db5f9e4965c3d17e937881c69d4e7edf3df92e65dd4",
+ "size": 77824
+ }
+ ]
+ },
+ "index": {
+ "bytes": 1128,
+ "index_sha1": "acc33096abf3927200be57616ce87669d43efeeb",
+ "nonzero_fanout_buckets": [
+ {
+ "cumulative": 1,
+ "prefix": "58",
+ "range_start": 0
+ },
+ {
+ "cumulative": 2,
+ "prefix": "d2",
+ "range_start": 1
+ }
+ ],
+ "pack_sha1": "736fdd73b58a6a68dfefec9288533a8d0a41a9e6",
+ "sha256": "57fb9cfc0ac21a82384477f34b05e575b46f2a344bc10942dd4216603e5cb206",
+ "version": 2
+ },
+ "object_format": "sha1",
+ "objects_in_pack_order": [
+ {
+ "crc32": "b6dfc85b",
+ "index_crc32": "b6dfc85b",
+ "index_offset": 12,
+ "label": "line-1024-changed",
+ "object_type": "blob",
+ "offset": 12,
+ "oid": "586c379527cbf256bb8dc7558e808ae5150a8959",
+ "packed_size": 77843,
+ "payload_sha256": "e6bd970352e9ed0dc5389db5f9e4965c3d17e937881c69d4e7edf3df92e65dd4",
+ "representation": "full",
+ "size": 77824
+ },
+ {
+ "base_label": "line-1024-changed",
+ "base_offset": 12,
+ "base_oid": "586c379527cbf256bb8dc7558e808ae5150a8959",
+ "crc32": "84af9f53",
+ "delta_depth": 1,
+ "index_crc32": "84af9f53",
+ "index_offset": 77855,
+ "label": "baseline",
+ "object_type": "blob",
+ "offset": 77855,
+ "ofs_distance": 77843,
+ "ofs_offset_bytes_hex": "83df13",
+ "oid": "d2e8559ccc7b0bcfd193b7e9ad0b9d59982eb7c6",
+ "packed_size": 42,
+ "payload_sha256": "ea612ce3c3fb55f7a05ceecf1bcbf0ecf62fe298a8e387011e21f0d3d6353f1a",
+ "representation": "ofs-delta",
+ "size": 77824,
+ "stored_size": 26
+ }
+ ],
+ "pack": {
+ "bytes": 77917,
+ "delta_count": 1,
+ "full_count": 1,
+ "max_delta_depth": 1,
+ "object_count": 2,
+ "ofs_delta_count": 1,
+ "ref_delta_count": 0,
+ "sha256": "080b1ca0b5cdb6c5e4cac746a48b8feb218aa7ec0b5583024a493d110c319a31",
+ "trailer_sha1": "736fdd73b58a6a68dfefec9288533a8d0a41a9e6",
+ "version": 2
+ },
+ "pack_objects": {
+ "normalized_argv": [
+ "git",
+ "pack-objects",
+ "--delta-base-offset",
+ "--window=2",
+ "--depth=1",
+ "--threads=1",
+ "--compression=0",
+ "--no-reuse-delta",
+ "--no-reuse-object",
+ "--index-version=2",
+ "/fixture"
+ ],
+ "stdin_bytes": 82,
+ "stdin_oid_order": [
+ "586c379527cbf256bb8dc7558e808ae5150a8959",
+ "d2e8559ccc7b0bcfd193b7e9ad0b9d59982eb7c6"
+ ],
+ "stdin_sha256": "fa3a61ef14c4439502fdbfbaf0fe8a5b666b5ee54f70d48b99a14beb172cf952"
+ },
+ "schema_version": "git-pack-ofs-delta-lab/v1",
+ "scope": {
+ "arbitrary_repository_supported": false,
+ "authentication_claim": false,
+ "byte_identity_requires_same_git_build": true,
+ "fixture_kind": "two deterministic similar synthetic blobs",
+ "git_pack_objects_executed": true,
+ "network_required": false,
+ "ofs_delta_supported": true,
+ "ref_delta_supported": false,
+ "thin_pack_supported": false
+ }
+ }
+}
diff --git a/docs/demo/git-pack-ofs-delta-v1/manifest.json b/docs/demo/git-pack-ofs-delta-v1/manifest.json
new file mode 100644
index 0000000..49632e0
--- /dev/null
+++ b/docs/demo/git-pack-ofs-delta-v1/manifest.json
@@ -0,0 +1,177 @@
+{
+ "artifacts": [
+ {
+ "path": "docs/assets/git-pack-ofs-cli.svg",
+ "role": "visualized exact pack-ofs-verify transcript",
+ "sha256": "66e4ca96db44e7fbb4e6c31e95385fd963a270854b37a973943d0279bfdd4e8f",
+ "size": 2768
+ },
+ {
+ "path": "docs/assets/git-pack-ofs-reconstruction.svg",
+ "role": "actual OFS base distance and reconstructed object flow",
+ "sha256": "e2c655c185b562767e4bd92b7de45be11b49425e0800a291ab24dd104339ba32",
+ "size": 3884
+ },
+ {
+ "path": "docs/assets/git-pack-ofs-report.png",
+ "role": "attested OFS_DELTA offline report browser capture",
+ "sha256": "2e3a4e813cebf28a18d60bc65d9d3eb5d5426b2e702ac36a560a7c52465a3041",
+ "size": 598564
+ },
+ {
+ "path": "docs/assets/git-pack-ofs-workflow.svg",
+ "role": "source-bound Git OFS evidence workflow",
+ "sha256": "3641349f1632c500ef657c15a6e3f1c53b54b750bddf4c732e7b5d13d9c05610",
+ "size": 4689
+ },
+ {
+ "path": "docs/demo/git-pack-ofs-delta-v1/capture-attestation.json",
+ "role": "OFS capture provenance and isolation attestation",
+ "sha256": "f4d4fd7ec4551516c33e452e447dc55b4572950d3faa1fac155985c1c81e0107",
+ "size": 2026
+ },
+ {
+ "path": "docs/demo/git-pack-ofs-delta-v1/inspect.json",
+ "role": "exact pretty pack-ofs-inspect stdout",
+ "sha256": "3234380d7f5e9a6590bb3f0ee33206c8cf588cc8af054979448d4020c5421637",
+ "size": 4712
+ },
+ {
+ "path": "docs/demo/git-pack-ofs-delta-v1/rendered-dom.html",
+ "role": "actual DOM emitted during the OFS report capture",
+ "sha256": "acf985e2f5a5d68ef02ecad57dcbf9493f8bcd5b2aa36dfac1a39dd5b748e0d5",
+ "size": 6288
+ },
+ {
+ "path": "docs/demo/git-pack-ofs-delta-v1/report.html",
+ "role": "dependency-free OFS_DELTA offline report",
+ "sha256": "ac67aa531f616b148df847a92e3a228063ea9591338054b247118f4065d7b486",
+ "size": 6288
+ },
+ {
+ "path": "docs/demo/git-pack-ofs-delta-v1/verify.txt",
+ "role": "exact pack-ofs-verify stdout",
+ "sha256": "c33227146c3483414cb444d82ddcffb41abda71a9911d622e0e0f0cc66721d59",
+ "size": 212
+ },
+ {
+ "path": "evidence/git-pack-ofs-delta-v1.json",
+ "role": "canonical compact real OFS_DELTA CLI evidence",
+ "sha256": "0a5a820ae6a1d985ff54f99f10b632a548a3cf84f36fceffacc359be62c942e1",
+ "size": 3459
+ }
+ ],
+ "capture": {
+ "attestation": "docs/demo/git-pack-ofs-delta-v1/capture-attestation.json",
+ "attestation_receipt_sha256": "5891c29f10f3f5bddd736aae13829a16c4899a6cda2c47952d190025342c31b9",
+ "browser_binary": "/ms-playwright/chromium_headless_shell-1193/chrome-linux/headless_shell",
+ "browser_sha256": "003728e0b77eb9d52e4d258594bd55ce22ecd245eb6d3b6858fbd844c901ad7d",
+ "browser_version": "Chromium 140.0.7339.186",
+ "container_image": "mcr.microsoft.com/playwright@sha256:2f29369043d81d6d69a815ceb80760f55e85f5020371ad06a4d996f18503ad1c",
+ "network": "none",
+ "rendered_dom_sha256": "acf985e2f5a5d68ef02ecad57dcbf9493f8bcd5b2aa36dfac1a39dd5b748e0d5",
+ "screenshot_sha256": "2e3a4e813cebf28a18d60bc65d9d3eb5d5426b2e702ac36a560a7c52465a3041",
+ "status": "attested",
+ "viewport": {
+ "height": 1500,
+ "width": 1440
+ }
+ },
+ "commands": [
+ {
+ "argv": [
+ "python3",
+ "-B",
+ "-m",
+ "git_dag_lab",
+ "pack-ofs-verify"
+ ],
+ "exit_code": 0,
+ "fresh_runs": 2,
+ "stderr_bytes": 0,
+ "stdout": "docs/demo/git-pack-ofs-delta-v1/verify.txt"
+ },
+ {
+ "argv": [
+ "python3",
+ "-B",
+ "-m",
+ "git_dag_lab",
+ "pack-ofs-inspect",
+ "--compact"
+ ],
+ "exit_code": 0,
+ "fresh_runs": 2,
+ "stderr_bytes": 0,
+ "stdout": "evidence/git-pack-ofs-delta-v1.json"
+ },
+ {
+ "argv": [
+ "python3",
+ "-B",
+ "-m",
+ "git_dag_lab",
+ "pack-ofs-inspect"
+ ],
+ "exit_code": 0,
+ "fresh_runs": 2,
+ "stderr_bytes": 0,
+ "stdout": "docs/demo/git-pack-ofs-delta-v1/inspect.json"
+ }
+ ],
+ "git_build": {
+ "byte_identity_scope": "same recorded Git build",
+ "frontend_sha256": "f54a87f6253aab09ed7b522bd78ddeab509105b1043076209d89127e55877a48",
+ "pack_objects_sha256": "f54a87f6253aab09ed7b522bd78ddeab509105b1043076209d89127e55877a48",
+ "version": "git version 2.54.0"
+ },
+ "report_receipt_sha256": "8c2b8b07e9ab48492e9de13167c86eaf8835adcceecdcff958a6080a7ae540b0",
+ "schema_version": "git-pack-ofs-evidence-manifest/v1",
+ "sources": [
+ {
+ "path": "git_dag_lab/__init__.py",
+ "sha256": "c3aa1ce7deabf04c718f103bc2ba93cd964efbf5cff159b26d87fbd1c6bd4279",
+ "size": 475
+ },
+ {
+ "path": "git_dag_lab/__main__.py",
+ "sha256": "33386ce299571769ff97cf7c6757336ff49ed023357bdcd1579d502d667391a5",
+ "size": 105
+ },
+ {
+ "path": "git_dag_lab/cli.py",
+ "sha256": "e634feb9a908e3b0f46e1011c64667000b9e43ceb6ce1233b9fda1ce166a35ac",
+ "size": 2972
+ },
+ {
+ "path": "git_dag_lab/lab.py",
+ "sha256": "289e688e84024c20b94f3aa2e59be693b81b507b8581fe5547cc8f5eb223879b",
+ "size": 34676
+ },
+ {
+ "path": "git_dag_lab/pack.py",
+ "sha256": "b2b7061751f09997673b09a235e5257c8a2e93de82ad523703aa1bc015d4c765",
+ "size": 39441
+ },
+ {
+ "path": "tools/generate_evidence.py",
+ "sha256": "9276b529ec13eaa6ceda1cab1282b6679a689697e5c6930ca17b5e0bc8ba3a92",
+ "size": 49590
+ },
+ {
+ "path": "tools/generate_pack_evidence.py",
+ "sha256": "234af1ac72189cec9034d3b7f396f6950b01564495208a8891620bb7721ec3a9",
+ "size": 41376
+ },
+ {
+ "path": "tools/generate_ofs_evidence.py",
+ "sha256": "866a7fbe41d0cf87386f07d7ee82cf48382836333a2ee7f3cda3862d0ea26c7a",
+ "size": 41449
+ },
+ {
+ "path": "tools/capture_ofs_report.sh",
+ "sha256": "638de7acced052805c52e2bb85de3dd1697a61254595299111f8ab6fea3afae1",
+ "size": 11144
+ }
+ ]
+}
diff --git a/docs/demo/git-pack-ofs-delta-v1/rendered-dom.html b/docs/demo/git-pack-ofs-delta-v1/rendered-dom.html
new file mode 100644
index 0000000..9f84ce6
--- /dev/null
+++ b/docs/demo/git-pack-ofs-delta-v1/rendered-dom.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+ Git OFS_DELTA evidence — verified offline report
+
+
+
+
+
Git pack lab · actual OFS_DELTA offline report
+
One backward edge. Two verified blobs.
+
Real git pack-objects --delta-base-offset output is decoded without asking Git to replay it: the bounded delta program reconstructs the target, then index v2 independently binds both physical offsets and CRC32 rows.
Real git pack-objects --delta-base-offset output is decoded without asking Git to replay it: the bounded delta program reconstructs the target, then index v2 independently binds both physical offsets and CRC32 rows.