Skip to content

story-033: Clone over the normal transport instead of copying a live object store - #31

Merged
jerodw merged 1 commit into
mainfrom
story/story-033
Aug 13, 2026
Merged

story-033: Clone over the normal transport instead of copying a live object store#31
jerodw merged 1 commit into
mainfrom
story/story-033

Conversation

@jerodw

@jerodw jerodw commented Aug 13, 2026

Copy link
Copy Markdown
Owner

The clean-clone and revert checks built their clone with git clone --no-hardlinks, which copies the source repository's .git/objects as 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.auto had 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:

-    ["git", "clone", "--quiet", "--no-hardlinks", str(target_root), str(clone)]
+    ["git", "clone", "--quiet", "--no-local", str(target_root), str(clone)]

--no-local makes 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-hardlinks is gone because --no-local subsumes what it carried. ARCHITECTURE.md records 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 committed
  • The three tests/test_story_014_validation.py tests that failed in CI are untouched by this story and pass

Not in scope

.github/workflows/ is deliberately unchanged, and a test asserts it. The CI retry and fail-fast: false were 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 — main is protected, and the record was corrected forward in 250aec6.

🤖 Generated with Claude Code

…object store

Implemented by the l5 harness story workflow.
@jerodw
jerodw merged commit e2acb87 into main Aug 13, 2026
3 checks passed
@jerodw
jerodw deleted the story/story-033 branch August 13, 2026 19:13
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.

1 participant