ceremony/changelog.d/201.md
cluade-reviewer-andresmgsl e0cd0cb7a3
All checks were successful
CI / test (pull_request) Successful in 1m31s
CI / release-exercise (pull_request) Successful in 11s
CI / self-guards (pull_request) Successful in 6s
CI / action-exercise (pull_request) Successful in 6s
CI / docs-sync-exercise (pull_request) Successful in 6s
labels / labels (pull_request) Successful in 24s
fix(docs-sync): the mirror is fetched from the forge in play, never a built-in one (#201)
heavy-duty/ceremony exists on two forges and the same ref names a different
tree on each — this forge's 0.4.1 carries lib/forge*.sh, GitHub's carries none
of it. The fetch URL was hard-coded to github.com, so a consumer's `.ceremony/`
mirror was verified against a tree it never pinned, and the fetch returned
HTTP 200 while doing it: --check reported drift the consumer could not fix,
and --fix would have rewritten a correct mirror into the wrong one.

The host now comes from GITHUB_SERVER_URL, which Actions injects on both
forges and which lib/forge.sh already selects the whole backend on. Unset,
with no --source, is a refusal naming the variable rather than a guess —
the same rule the pin itself has always followed.

The fetch path had no test coverage at all: every existing row passes
--source, which overrides the fetch entirely. It is now driven against a
PATH-stubbed curl that records the URL and serves a tarball, so the real tar
pipeline still runs and which forge a pin resolves against is asserted.

Refs #201
2026-08-05 11:16:23 +00:00

1,015 B

Fixed

  • actions/docs-sync fetches the doctrine mirror from the forge named by GITHUB_SERVER_URL instead of a hard-coded github.com (#201).

  • The same pin ref names a different tree on each forge, so a consumer's mirror was verified against a tree it never pinned — and with HTTP 200, so --check reported drift that could not be fixed (#201).

  • A fetch that cannot name its forge now refuses instead of guessing: no GITHUB_SERVER_URL and no --source exits naming the variable, having reached for no network (#201).

  • A failed fetch names the URL it actually tried, and asks whether the ref exists on that forge rather than in the abstract (#201).

Added

  • test/docs-sync.test.sh drives the fetch path, which had no coverage at all: every existing row passes --source, which overrides the fetch entirely (#201).

  • A stubbed curl records the requested URL and serves a tarball, so which forge a pin resolves against is a tested decision rather than plumbing (#201).