Skip to content

The honest bundle fails from a default Windows clone - #9

Merged
egnaro9 merged 1 commit into
egnaro9:mainfrom
GiulioDER:pr4/windows-clone-verdict
Aug 18, 2026
Merged

The honest bundle fails from a default Windows clone#9
egnaro9 merged 1 commit into
egnaro9:mainfrom
GiulioDER:pr4/windows-clone-verdict

Conversation

@GiulioDER

Copy link
Copy Markdown
Contributor

Not a verifier defect. A distribution one, and it lands on exactly the person this project is aimed at: the stranger who clones and replays.

Reproduction

On a clean machine with the Git for Windows installer defaults:

git clone https://github.com/egnaro9/vac-protocol.git
cd vac-protocol
python -m vac.verify fixtures/valid     # exit 1

Twenty reasons, all of this shape:

FAIL sha256-mismatch: evidence/bundle.json: manifest 64931fe8d466c2cf..., file a2433da20fdc0bfb...
FAIL sha256-mismatch: evidence/RESULTS.md: manifest d2beb88d2ef58ee6..., file 6598a891710e9c4e...

core.autocrlf is on by default in that installer, this repository carries no .gitattributes, so checkout rewrites every text artifact to CRLF and every sha256 in the manifest stops matching its file.

The bundle is honest, the manifest is honest, and the verifier is right to refuse what it was handed: the bytes really did change between your commit and my disk. Your CI is ubuntu only, so nothing upstream can see it. I hit it as the very first thing that happened when I re-cloned to work on #2, and spent a few minutes assuming I had broken something.

It is the same class as the encoding finding in #2, one layer out. There the same bytes produced opposite verdicts depending on the host codec. Here the same commit produces different bytes depending on the host's git config.

Two parts, because a fresh clone and an existing one need different things

.gitattributes with * -text turns the conversion off for every future clone. Verified end to end: cloning this branch with core.autocrlf=true yields LF artifacts and python -m vac.verify fixtures/valid exits 0, where the same clone of main exits 1.

tests/test_checkout_integrity.py is the named reason for the clones that already happened. A developer whose checkout is already converted currently gets twenty hash mismatches and no cause. This gives one failure that says what happened and the two commands that repair it:

git config core.autocrlf false
git rm --cached -r . && git reset --hard

It also pins the attribute itself, so dropping it later fails loudly rather than silently, on the same principle as the rest of your suite: a gate that cannot name why it fired cannot be audited.

Scope

The test file is new and the attribute file is new, so this touches nothing else and is independent of #2 and #3. It can land in any order, including first.

ruff clean. The three new tests pass here; the .gitattributes one fails against main, which is the point.

Not a verifier defect. A distribution one, and it lands on exactly the
person this project is aimed at: the stranger who clones and replays.

REPRODUCTION, on a clean machine with the Git for Windows installer defaults:

    git clone https://github.com/egnaro9/vac-protocol.git
    cd vac-protocol
    python -m vac.verify fixtures/valid    # exit 1

Twenty reasons, all of this shape:

    FAIL sha256-mismatch: evidence/bundle.json: manifest 64931fe8..., file
    a2433da2...

core.autocrlf is ON by default in that installer, the repository carries no
.gitattributes, so checkout rewrites every text artifact to CRLF and every
sha256 in the manifest stops matching its file. The bundle is honest, the
manifest is honest, the verifier is right to refuse what it was handed: the
bytes really did change between your commit and my disk. CI is ubuntu-only,
so nothing upstream can see this, and I hit it myself as the first thing that
happened when I re-cloned to work on egnaro9#2.

It is the same class as the encoding finding in egnaro9#2, one layer out. There the
same bytes produced opposite verdicts depending on the host codec; here the
same commit produces different BYTES depending on the host's git config.

Two parts, because a fresh clone and an existing one need different things.

`* -text` in .gitattributes turns the conversion off for every future clone.
Verified end to end: cloning this branch with core.autocrlf=true yields LF
artifacts and `python -m vac.verify fixtures/valid` exits 0, where the same
clone of main exits 1.

tests/test_checkout_integrity.py is the named reason for the clones that
already happened. A developer whose checkout is already converted currently
gets twenty hash mismatches and no cause; this gives one failure that says
what happened and the two commands that repair it. It also pins the
attribute, so dropping it later fails loudly rather than silently, on the
same principle as the rest of the suite: a gate that cannot name why it fired
cannot be audited.

The test file is new and touches nothing else, so this stands alone: it is
independent of egnaro9#2 and egnaro9#3 and can land in any order.

Verified: the three new tests pass here, the first fails against main (no
.gitattributes), ruff clean.

Signed-off-by: giulio d'erme <giulio@derme.dev>
@egnaro9
egnaro9 merged commit 81f50cf into egnaro9:main Aug 18, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants