Skip to content

CI follow-ups from #140 review (shared with atelier-store) #144

Closed

Description

@mpaulosky

Copilot's review of #140 raised three findings that apply to atelier-store too, since IssueTracker now shares its workflow baseline. Fix them in both repos.

1. Releases can be versioned out of merge order

release.yml uses per-PR concurrency (release-<pr number>). If two PRs merge close together, the later one can reserve the next tag first. The earlier one then takes the version after it on an older commit, so the "latest" release leaves out the later PR's changes and the generated release ranges are wrong. The tag push stops duplicate versions but doesn't serialize releases in main order.

Possible fix: one concurrency group for all release runs (release-main, cancel-in-progress: false), with each run versioning from its own merge commit.

2. The pre-commit hook lints the working tree, not the staged content

.github/hooks/pre-commit runs markdownlint on the working-tree paths. With a partially staged Markdown file, the working copy can pass while the staged version fails, so the commit goes through and CI fails later.

Possible fix: lint an index snapshot (write each file from git show :path to a temp dir), or refuse files that have unstaged changes.

3. The test matrix rebuilds each project

The matrix jobs run on fresh runners, don't restore the build-artifact cache, and dotnet test rebuilds every project that doesn't set NO_BUILD. That's correct, but it costs CI time.

Possible fix: upload the build output as an artifact (or restore the cache) and use --no-build everywhere, or drop the unused "Cache build artifacts" step and describe the jobs as rebuilding per project.

🤖 Generated with Claude Code

Activity

  1. mpaulosky commented on Sep 30, 2026

    @mpaulosky
    OwnerAuthor

    All three findings are fixed here and in atelier-store (mpaulosky/atelier-store#86):

    1. Release order: serialized releases with a planner and one blog PR per run (ci(release): Release merged PRs one at a time, in merge order #172, then fix(release): Skip a named PR merged elsewhere; mark a published draft #184, fix(release): Wait for a just-published Release to be listed #190, ci(release): List again every 2s, for up to 30s #192). Verified live, including the run that found the release-list lag behind fix(release): Wait for a just-published Release to be listed #190.
    2. Pre-commit lints staged content: ci(hooks): Lint the staged Markdown, not the working copy #170, test(hooks): Fail the rename case when git reports no rename #180.
    3. Test matrix: ci: Drop the unused build-artifact cache #178 dropped the unused cache after measuring the options (the per-project matrix was fastest), with the docs-only skip (ci: Skip the build and tests on docs-only PRs #175, ci: Classify a PR's changed files in a tested script #188) so blog PRs skip the build.

    The branch-name standard (#182, #186) came along the way. The process is written up in the repo-ci-baseline skill.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions