Repository navigation
Reference the pipelines absolutely, not relatively - #22
Merged
matt-edmondson merged 1 commit intoSep 16, 2026
Merged
Conversation
Sorting's first push to main after adopting ci.yml failed to compile: error parsing called workflow ".github/workflows/ci.yml" -> "ktsu-dev/.github/.github/workflows/ci-shared.yml@release" (source tag with sha:af44498...) --> "./.github/workflows/dotnet.yml" : workflow was not found. af44498 is the annotated tag's own object sha, not c9ef0b3 which it points at. A relative `./` inside a workflow reached through a tag is resolved against the tag object, and a tag object has no tree, so nothing is found. This is worth stating precisely because the relative form DID resolve on the canary's pull_request run -- the run recorded dotnet.yml@af44498 and went green across all eight jobs -- and I took that as proof the nested case worked. It holds on pull_request and fails on push, so the evidence was real and the conclusion drawn from it was wrong. A form that works until the first push to a default branch is worse than one that never works. Naming the repository and tag explicitly resolves identically on every event. `release` is promoted as one unit, so the dispatcher and the pipeline it selects still move together. The cost is that a pull request here tests its ci-shared.yml against the released pipelines rather than its own, so changing a pipeline and the dispatcher together wants two promotions. Recorded in the docs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014RABe2NufFc9hwm94iB3Rf
matt-edmondson
deleted the
claude/dependabot-ci-workflow-rollout-fbrhdn
branch
September 16, 2026 10:42
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.
Urgent —
ktsu-dev/Sorting'smaincurrently has no working CIThe first push to
mainafter Sorting adoptedci.ymlfailed to compile:af44498is the annotated tag's own object sha, notc9ef0b3which it points at. A relative./inside a workflow that was itself reached through a tag is resolved by GitHub against the tag object, and a tag object has no tree — so the lookup finds nothing.Correcting the record
I reported the nested relative resolution as verified. That was wrong, and the way it was wrong is the interesting part.
The canary's
pull_requestrun genuinely did resolve it — the run recordedktsu-dev/.github/.github/workflows/dotnet.yml@af44498inreferenced_workflowsand went green across all eight jobs, three platforms, Sonar and all. I treated that as proof the nested case worked.It holds on
pull_requestand fails onpush. The evidence was real; the conclusion I drew from it was too broad. A construct that works right up until the first push to a default branch is worse than one that never works at all, because it passes the canary.The fix
Both pipeline references in
ci-shared.ymlbecome absolute:Naming the repository and tag explicitly resolves identically on every event, and works whether or not the tag is annotated. Because
releaseis promoted as one unit, the dispatcher and the pipeline it selects still move together — the atomicity the relative form was chosen for is preserved.The cost, recorded in the docs
A pull request against this repository now tests its
ci-shared.ymlagainst the released pipelines rather than its own. Changing a pipeline and the dispatcher together therefore wants two promotions, or a throwaway tag. That is a real downgrade in testability and it is written down indocs/shared-ci.mdrather than left to be rediscovered.After this merges
main).mainrun — it should compile and go green, this time exercisingReleaseandSecurity Scanning, which the PR run skipped by design and which have therefore never run through the dispatcher.Bearing on the fan-out
The fan-out stays blocked until Sorting's
mainis green. This failure mode is invisible on a pull request, so "the canary PR passed" is not sufficient evidence to migrate 50 repositories — the canary'smainhas to be green too.Testing
actionlint1.7.7 withshellcheckclean;markdownlint-cliclean.🤖 Generated with Claude Code
https://claude.ai/code/session_014RABe2NufFc9hwm94iB3Rf
Generated by Claude Code