story-033: Clone over the normal transport instead of copying a live object store - #31
Merged
Conversation
…object store Implemented by the l5 harness story workflow.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The clean-clone and revert checks built their clone with
git clone --no-hardlinks, which copies the source repository's.git/objectsas a directory tree. Git enumerates that tree and then copies it, and anything that disappears in between is a hard failure. Three CI runs failed exactly that way.What established the cause
Two of the failures named loose objects and could be read as bad luck. The third named
objects/pack/multi-pack-index.lock— a lock file, which exists only while something is writing a multi-pack index in the source repository. Git listed it, then failed to copy it because it had already been released.That is not runner weather. It proves the source was being repacked while the clone read it, and copying a live object store cannot be correct under that condition.
gc.autohad been ruled out correctly — a fixture repository holds three loose objects against a threshold of 6700 — but a different writer exists.What changed
One call site,
orchestration/story_coordinator.py:--no-localmakes git negotiate a pack over a pipe rather than walking the source's object directory, so transient files are never touched — whatever is writing them. That is the reason to prefer it over disabling the writer: it makes the failure impossible rather than unlikely, and it holds against writers nobody has identified.--no-hardlinksis gone because--no-localsubsumes what it carried.ARCHITECTURE.mdrecords that property explicitly rather than leaving the removal to look like a simplification: the clone's objects are its own, so nothing the source later does can reach them.Verification
1663 passed, 27 written; verification passed first iteration, no retries; clean-clone green with the story committedtests/test_story_014_validation.pytests that failed in CI are untouched by this story and passNot in scope
.github/workflows/is deliberately unchanged, and a test asserts it. The CI retry andfail-fast: falsewere added while the cause was unknown; they are a backstop for the next unknown, not this story's fix, and a green job that needed two attempts still says so in its annotation.The two commits describing the cause as unestablished are not rewritten —
mainis protected, and the record was corrected forward in250aec6.🤖 Generated with Claude Code